#define DLL

#include "Anime4KGPUCNN.h"

Anime4KCPP::Anime4KGPUCNN::Anime4KGPUCNN(const Parameters& parameters) :
    Anime4K(parameters) {}

void Anime4KCPP::Anime4KGPUCNN::process()
{
    std::function<void(cv::InputArray, cv::OutputArray)> runKernel;
    if (HDN)
    {
        runKernel =
            [this](cv::InputArray orgImg, cv::OutputArray dstImg)
        {
            runKernelACNetHDN(orgImg, dstImg);
        };
    }
    else
    {
        runKernel =
            [this](cv::InputArray orgImg, cv::OutputArray dstImg)
        {
            runKernelACNet(orgImg, dstImg);
        };
    }

    if (fm)
    {
        if (!vm)
        {
            if (!inputYUV)
            {
                cv::Mat uv;
                if (zf > 2.0)
                    cv::resize(orgImg, orgImg, cv::Size(0, 0), zf / 2.0, zf / 2.0, cv::INTER_LANCZOS4);
                else if (zf < 2.0)
                    cv::resize(orgImg, orgImg, cv::Size(0, 0), zf / 2.0, zf / 2.0, cv::INTER_AREA);
                cv::cvtColor(orgImg, orgImg, cv::COLOR_BGR2YUV);

                std::vector<cv::Mat> yuv(3);
                cv::split(orgImg, yuv);
                orgImg = yuv[Y];
                cv::merge(std::vector<cv::Mat>{ yuv[U],yuv[V] }, uv);
                dstImg.create(orgImg.rows * 2, orgImg.cols * 2, CV_8UC1);
                runKernel(orgImg, dstImg);
                cv::resize(uv, uv, cv::Size(0, 0), 2.0, 2.0, cv::INTER_LANCZOS4);
                cv::merge(std::vector<cv::Mat>{ dstImg,uv }, dstImg);

                cv::cvtColor(dstImg, dstImg, cv::COLOR_YUV2BGR);
            }
            else
            {
                if (zf > 2.0)
                    cv::resize(orgY, orgY, cv::Size(0, 0), zf / 2.0, zf / 2.0, cv::INTER_LANCZOS4);
                else if (zf < 2.0)
                    cv::resize(orgY, orgY, cv::Size(0, 0), zf / 2.0, zf / 2.0, cv::INTER_AREA);

                dstY.create(orgY.rows * 2, orgY.cols * 2, CV_8UC1);
                runKernel(orgY, dstY);

                cv::resize(orgU, dstU, cv::Size(0, 0), 2.0, 2.0, cv::INTER_LANCZOS4);
                cv::resize(orgV, dstV, cv::Size(0, 0), 2.0, 2.0, cv::INTER_LANCZOS4);
            }
        }
        else
        {
            videoIO->init(
                [this, &runKernel]()
                {
                    Frame frame = videoIO->read();
                    cv::Mat orgFrame = frame.first;
                    cv::Mat dstFrame;

                    cv::Mat uv;
                    if (zf > 2.0)
                        cv::resize(orgFrame, orgFrame, cv::Size(0, 0), zf / 2.0, zf / 2.0, cv::INTER_LANCZOS4);
                    else if (zf < 2.0)
                        cv::resize(orgFrame, orgFrame, cv::Size(0, 0), zf / 2.0, zf / 2.0, cv::INTER_AREA);
                    cv::cvtColor(orgFrame, orgFrame, cv::COLOR_BGR2YUV);

                    std::vector<cv::Mat> yuv(3);
                    cv::split(orgFrame, yuv);
                    orgFrame = yuv[Y];
                    cv::merge(std::vector<cv::Mat>{ yuv[U],yuv[V] }, uv);
                    dstFrame.create(orgFrame.rows * 2, orgFrame.cols * 2, CV_8UC1);
                    runKernel(orgFrame, dstFrame);
                    cv::resize(uv, uv, cv::Size(0, 0), 2.0, 2.0, cv::INTER_LANCZOS4);
                    cv::merge(std::vector<cv::Mat>{ dstFrame,uv }, dstFrame);

                    cv::cvtColor(dstFrame, dstFrame, cv::COLOR_YUV2BGR);

                    frame.first = dstFrame;
                    videoIO->write(frame);
                }
                , mt
                    ).process();
        }
    }
    else
    {
        double tmpZf = log2(zf);
        if (tmpZf < 0.0001)
            tmpZf = 1.0 - 0.0002;
        int tmpZfUp = ceil(tmpZf);

        if (!vm)
        {
            if (!inputYUV)
            {
                cv::Mat tmpImg = orgImg;
                cv::Mat uv;
                cv::cvtColor(tmpImg, tmpImg, cv::COLOR_BGR2YUV);
                std::vector<cv::Mat> yuv(3);
                cv::split(tmpImg, yuv);
                tmpImg = yuv[Y];
                cv::merge(std::vector<cv::Mat>{ yuv[U],yuv[V] }, uv);
                for (int i = 0; i < tmpZfUp; i++)
                {
                    dstImg.create(tmpImg.rows * 2, tmpImg.cols * 2, CV_8UC1);
                    runKernel(tmpImg, dstImg);
                    cv::resize(uv, uv, cv::Size(0, 0), 2.0, 2.0, cv::INTER_LANCZOS4);
                    tmpImg = dstImg;
                }
                cv::merge(std::vector<cv::Mat>{ dstImg,uv }, dstImg);
                cv::cvtColor(dstImg, dstImg, cv::COLOR_YUV2BGR);
                if (tmpZfUp - tmpZf > 0.00001)
                {
                    cv::resize(dstImg, dstImg, cv::Size(W, H), 0, 0, cv::INTER_AREA);
                }
            }
            else
            {
                cv::Mat tmpY = orgY;
                dstU = orgU;
                dstV = orgV;
                for (int i = 0; i < tmpZfUp; i++)
                {
                    dstY.create(tmpY.rows * 2, tmpY.cols * 2, CV_8UC1);
                    runKernel(tmpY, dstY);
                    cv::resize(dstU, dstU, cv::Size(0, 0), 2.0, 2.0, cv::INTER_LANCZOS4);
                    cv::resize(dstV, dstV, cv::Size(0, 0), 2.0, 2.0, cv::INTER_LANCZOS4);
                    tmpY = dstY;
                }
                if (tmpZfUp - tmpZf > 0.00001)
                {
                    double currZf = zf / exp2(tmpZfUp);
                    cv::resize(dstY, dstY, cv::Size(0, 0), currZf, currZf, cv::INTER_AREA);
                    cv::resize(dstU, dstU, cv::Size(0, 0), currZf, currZf, cv::INTER_AREA);
                    cv::resize(dstV, dstV, cv::Size(0, 0), currZf, currZf, cv::INTER_AREA);
                }
            }
        }
        else
        {
            videoIO->init(
                [this, tmpZfUp, tmpZf, &runKernel]()
                {
                    Frame frame = videoIO->read();
                    cv::Mat orgFrame = frame.first;
                    cv::Mat dstFrame;

                    cv::Mat tmpFrame = orgFrame;
                    cv::Mat uv;
                    cv::cvtColor(tmpFrame, tmpFrame, cv::COLOR_BGR2YUV);
                    std::vector<cv::Mat> yuv(3);
                    cv::split(tmpFrame, yuv);
                    tmpFrame = yuv[Y];
                    cv::merge(std::vector<cv::Mat>{ yuv[U],yuv[V] }, uv);
                    for (int i = 0; i < tmpZfUp; i++)
                    {
                        dstFrame.create(tmpFrame.rows * 2, tmpFrame.cols * 2, CV_8UC1);
                        runKernel(tmpFrame, dstFrame);
                        cv::resize(uv, uv, cv::Size(0, 0), 2.0, 2.0, cv::INTER_LANCZOS4);
                        tmpFrame = dstFrame;
                    }
                    cv::merge(std::vector<cv::Mat>{ dstFrame,uv }, dstFrame);
                    cv::cvtColor(dstFrame, dstFrame, cv::COLOR_YUV2BGR);
                    if (tmpZfUp - tmpZf > 0.00001)
                    {
                        cv::resize(dstFrame, dstFrame, cv::Size(W, H), 0, 0, cv::INTER_AREA);
                    }

                    frame.first = dstFrame;
                    videoIO->write(frame);
                }
                , mt
                    ).process();
        }
    }
}

void Anime4KCPP::Anime4KGPUCNN::initGPU(unsigned int platformID, unsigned int deviceID, const CNNType type)
{
    if (!isInitialized)
    {
        pID = platformID;
        dID = deviceID;
        initOpenCL(type);
        isInitialized = true;
    }
}

void Anime4KCPP::Anime4KGPUCNN::releaseGPU()
{
    if (isInitialized)
    {
        releaseOpenCL();
        context = nullptr;
        commandQueue = nullptr;
        programACNet = nullptr;
        programACNetHDN = nullptr;
        device = nullptr;
        isInitialized = false;
    }
}

bool Anime4KCPP::Anime4KGPUCNN::isInitializedGPU()
{
    return isInitialized;
}

void Anime4KCPP::Anime4KGPUCNN::runKernelACNet(cv::InputArray orgImg, cv::OutputArray dstImg)
{
    cl_int err;
    int i;

    cv::Mat orgImage = orgImg.getMat();
    cv::Mat dstImage = dstImg.getMat();

    cl_image_format format;
    cl_image_format tmpFormat;
    cl_image_desc dstDesc;
    cl_image_desc orgDesc;

    const size_t orgin[3] = { 0,0,0 };
    const size_t orgRegion[3] = { size_t(orgImage.cols),size_t(orgImage.rows),1 };
    const size_t dstRegion[3] = { size_t(dstImage.cols),size_t(dstImage.rows),1 };
    const size_t orgSize[2] = { size_t(orgImage.cols),size_t(orgImage.rows) };
    const size_t dstSize[2] = { size_t(dstImage.cols),size_t(dstImage.rows) };
    
    const cl_int L2 = 0, L3 = 1, L4 = 2, L5 = 3, L6 = 4, L7 = 5, L8 = 6, L9 = 7;

    //init frame
    format.image_channel_data_type = CL_UNORM_INT8;
    format.image_channel_order = CL_R;

    tmpFormat.image_channel_data_type = CL_FLOAT;
    tmpFormat.image_channel_order = CL_RGBA;

    orgDesc.image_type = CL_MEM_OBJECT_IMAGE2D;
    orgDesc.image_height = orgImage.rows;
    orgDesc.image_width = orgImage.cols;
    orgDesc.image_row_pitch = 0;
    orgDesc.image_slice_pitch = 0;
    orgDesc.num_mip_levels = 0;
    orgDesc.num_samples = 0;
    orgDesc.buffer = nullptr;

    dstDesc.image_type = CL_MEM_OBJECT_IMAGE2D;
    dstDesc.image_height = dstImage.rows;
    dstDesc.image_width = dstImage.cols;
    dstDesc.image_row_pitch = 0;
    dstDesc.image_slice_pitch = 0;
    dstDesc.num_mip_levels = 0;
    dstDesc.num_samples = 0;
    dstDesc.buffer = nullptr;

    cl_kernel kernelConv1To8L1 = clCreateKernel(programACNet, "conv1To8", &err);
    if (err != CL_SUCCESS)
    {
        throw"Failed to create OpenCL kernel L1";
    }
    cl_kernel kernelConv8To8L2 = clCreateKernel(programACNet, "conv8To8", &err);
    if (err != CL_SUCCESS)
    {
        clReleaseKernel(kernelConv1To8L1);
        throw"Failed to create OpenCL kernel L2";
    }
    cl_kernel kernelConv8To8L3 = clCreateKernel(programACNet, "conv8To8", &err);
    if (err != CL_SUCCESS)
    {
        clReleaseKernel(kernelConv1To8L1);
        clReleaseKernel(kernelConv8To8L2);
        throw"Failed to create OpenCL kernel L3";
    }
    cl_kernel kernelConv8To8L4 = clCreateKernel(programACNet, "conv8To8", &err);
    if (err != CL_SUCCESS)
    {
        clReleaseKernel(kernelConv1To8L1);
        clReleaseKernel(kernelConv8To8L2);
        clReleaseKernel(kernelConv8To8L3);
        throw"Failed to create OpenCL kernel L4";
    }
    cl_kernel kernelConv8To8L5 = clCreateKernel(programACNet, "conv8To8", &err);
    if (err != CL_SUCCESS)
    {
        clReleaseKernel(kernelConv1To8L1);
        clReleaseKernel(kernelConv8To8L2);
        clReleaseKernel(kernelConv8To8L3);
        clReleaseKernel(kernelConv8To8L4);
        throw"Failed to create OpenCL kernel L5";
    }
    cl_kernel kernelConv8To8L6 = clCreateKernel(programACNet, "conv8To8", &err);
    if (err != CL_SUCCESS)
    {
        clReleaseKernel(kernelConv1To8L1);
        clReleaseKernel(kernelConv8To8L2);
        clReleaseKernel(kernelConv8To8L3);
        clReleaseKernel(kernelConv8To8L4);
        clReleaseKernel(kernelConv8To8L5);
        throw"Failed to create OpenCL kernel L6";
    }
    cl_kernel kernelConv8To8L7 = clCreateKernel(programACNet, "conv8To8", &err);
    if (err != CL_SUCCESS)
    {
        clReleaseKernel(kernelConv1To8L1);
        clReleaseKernel(kernelConv8To8L2);
        clReleaseKernel(kernelConv8To8L3);
        clReleaseKernel(kernelConv8To8L4);
        clReleaseKernel(kernelConv8To8L5);
        clReleaseKernel(kernelConv8To8L6);
        throw"Failed to create OpenCL kernel L7";
    }
    cl_kernel kernelConv8To8L8 = clCreateKernel(programACNet, "conv8To8", &err);
    if (err != CL_SUCCESS)
    {
        clReleaseKernel(kernelConv1To8L1);
        clReleaseKernel(kernelConv8To8L2);
        clReleaseKernel(kernelConv8To8L3);
        clReleaseKernel(kernelConv8To8L4);
        clReleaseKernel(kernelConv8To8L5);
        clReleaseKernel(kernelConv8To8L6);
        clReleaseKernel(kernelConv8To8L7);
        throw"Failed to create OpenCL kernel L8";
    }
    cl_kernel kernelConv8To8L9 = clCreateKernel(programACNet, "conv8To8", &err);
    if (err != CL_SUCCESS)
    {
        clReleaseKernel(kernelConv1To8L1);
        clReleaseKernel(kernelConv8To8L2);
        clReleaseKernel(kernelConv8To8L3);
        clReleaseKernel(kernelConv8To8L4);
        clReleaseKernel(kernelConv8To8L5);
        clReleaseKernel(kernelConv8To8L6);
        clReleaseKernel(kernelConv8To8L7);
        clReleaseKernel(kernelConv8To8L8);
        throw"Failed to create OpenCL kernel L9";
    }
    cl_kernel kernelConvTranspose8To1L10 = clCreateKernel(programACNet, "convTranspose8To1", &err);
    if (err != CL_SUCCESS)
    {
        clReleaseKernel(kernelConv1To8L1);
        clReleaseKernel(kernelConv8To8L2);
        clReleaseKernel(kernelConv8To8L3);
        clReleaseKernel(kernelConv8To8L4);
        clReleaseKernel(kernelConv8To8L5);
        clReleaseKernel(kernelConv8To8L6);
        clReleaseKernel(kernelConv8To8L7);
        clReleaseKernel(kernelConv8To8L8);
        clReleaseKernel(kernelConv8To8L9);
        throw"Failed to create OpenCL kernel L10";
    }


    cl_mem imageBufferOrg = clCreateImage(context, CL_MEM_READ_ONLY, &format, &orgDesc, nullptr, &err);
    if (err != CL_SUCCESS)
    {
        throw"imageBufferOrg error";
    }

    cl_mem imageBufferTmp11 = clCreateImage(context, CL_MEM_READ_WRITE, &tmpFormat, &orgDesc, nullptr, &err);
    if (err != CL_SUCCESS)
    {
        clReleaseMemObject(imageBufferOrg);
        throw"imageBufferTmp11 error";
    }

    cl_mem imageBufferTmp21 = clCreateImage(context, CL_MEM_READ_WRITE, &tmpFormat, &orgDesc, nullptr, &err);
    if (err != CL_SUCCESS)
    {
        clReleaseMemObject(imageBufferOrg);
        clReleaseMemObject(imageBufferTmp11);
        throw"imageBufferTmp21 error";
    }

    cl_mem imageBufferTmp12 = clCreateImage(context, CL_MEM_READ_WRITE, &tmpFormat, &orgDesc, nullptr, &err);
    if (err != CL_SUCCESS)
    {
        clReleaseMemObject(imageBufferOrg);
        clReleaseMemObject(imageBufferTmp11);
        clReleaseMemObject(imageBufferTmp21);
        throw"imageBufferTmp12 error";
    }

    cl_mem imageBufferTmp22 = clCreateImage(context, CL_MEM_READ_WRITE, &tmpFormat, &orgDesc, nullptr, &err);
    if (err != CL_SUCCESS)
    {
        clReleaseMemObject(imageBufferOrg);
        clReleaseMemObject(imageBufferTmp11);
        clReleaseMemObject(imageBufferTmp21);
        clReleaseMemObject(imageBufferTmp12);
        throw"imageBufferTmp22 error";
    }

    cl_mem imageBufferDst = clCreateImage(context, CL_MEM_WRITE_ONLY, &format, &dstDesc, nullptr, &err);
    if (err != CL_SUCCESS)
    {
        clReleaseMemObject(imageBufferOrg);
        clReleaseMemObject(imageBufferTmp11);
        clReleaseMemObject(imageBufferTmp21);
        clReleaseMemObject(imageBufferTmp12);
        clReleaseMemObject(imageBufferTmp22);
        throw"imageBufferDst error";
    }

    //L1
    err = clSetKernelArg(kernelConv1To8L1, 0, sizeof(cl_mem), &imageBufferOrg);
    err |= clSetKernelArg(kernelConv1To8L1, 1, sizeof(cl_mem), &imageBufferTmp11);
    err |= clSetKernelArg(kernelConv1To8L1, 2, sizeof(cl_mem), &imageBufferTmp21);
    if (err != CL_SUCCESS)
        throw"L1 clSetKernelArg error";
    //L2
    err = clSetKernelArg(kernelConv8To8L2, 0, sizeof(cl_mem), &imageBufferTmp11);
    err |= clSetKernelArg(kernelConv8To8L2, 1, sizeof(cl_mem), &imageBufferTmp21);
    err |= clSetKernelArg(kernelConv8To8L2, 2, sizeof(cl_mem), &imageBufferTmp12);
    err |= clSetKernelArg(kernelConv8To8L2, 3, sizeof(cl_mem), &imageBufferTmp22);
    err |= clSetKernelArg(kernelConv8To8L2, 4, sizeof(cl_int), &L2);
    if (err != CL_SUCCESS)
        throw"L2 clSetKernelArg error";
    //L3
    err = clSetKernelArg(kernelConv8To8L3, 0, sizeof(cl_mem), &imageBufferTmp12);
    err |= clSetKernelArg(kernelConv8To8L3, 1, sizeof(cl_mem), &imageBufferTmp22);
    err |= clSetKernelArg(kernelConv8To8L3, 2, sizeof(cl_mem), &imageBufferTmp11);
    err |= clSetKernelArg(kernelConv8To8L3, 3, sizeof(cl_mem), &imageBufferTmp21);
    err |= clSetKernelArg(kernelConv8To8L3, 4, sizeof(cl_int), &L3);
    if (err != CL_SUCCESS)
        throw"L3 clSetKernelArg error";
    //L4
    err = clSetKernelArg(kernelConv8To8L4, 0, sizeof(cl_mem), &imageBufferTmp11);
    err |= clSetKernelArg(kernelConv8To8L4, 1, sizeof(cl_mem), &imageBufferTmp21);
    err |= clSetKernelArg(kernelConv8To8L4, 2, sizeof(cl_mem), &imageBufferTmp12);
    err |= clSetKernelArg(kernelConv8To8L4, 3, sizeof(cl_mem), &imageBufferTmp22);
    err |= clSetKernelArg(kernelConv8To8L4, 4, sizeof(cl_int), &L4);
    if (err != CL_SUCCESS)
        throw"L4 clSetKernelArg error";
    //L5
    err = clSetKernelArg(kernelConv8To8L5, 0, sizeof(cl_mem), &imageBufferTmp12);
    err |= clSetKernelArg(kernelConv8To8L5, 1, sizeof(cl_mem), &imageBufferTmp22);
    err |= clSetKernelArg(kernelConv8To8L5, 2, sizeof(cl_mem), &imageBufferTmp11);
    err |= clSetKernelArg(kernelConv8To8L5, 3, sizeof(cl_mem), &imageBufferTmp21);
    err |= clSetKernelArg(kernelConv8To8L5, 4, sizeof(cl_int), &L5);
    if (err != CL_SUCCESS)
        throw"L5 clSetKernelArg error";
    //L6
    err = clSetKernelArg(kernelConv8To8L6, 0, sizeof(cl_mem), &imageBufferTmp11);
    err |= clSetKernelArg(kernelConv8To8L6, 1, sizeof(cl_mem), &imageBufferTmp21);
    err |= clSetKernelArg(kernelConv8To8L6, 2, sizeof(cl_mem), &imageBufferTmp12);
    err |= clSetKernelArg(kernelConv8To8L6, 3, sizeof(cl_mem), &imageBufferTmp22);
    err |= clSetKernelArg(kernelConv8To8L6, 4, sizeof(cl_int), &L6);
    if (err != CL_SUCCESS)
        throw"L6 clSetKernelArg error";
    //L7
    err = clSetKernelArg(kernelConv8To8L7, 0, sizeof(cl_mem), &imageBufferTmp12);
    err |= clSetKernelArg(kernelConv8To8L7, 1, sizeof(cl_mem), &imageBufferTmp22);
    err |= clSetKernelArg(kernelConv8To8L7, 2, sizeof(cl_mem), &imageBufferTmp11);
    err |= clSetKernelArg(kernelConv8To8L7, 3, sizeof(cl_mem), &imageBufferTmp21);
    err |= clSetKernelArg(kernelConv8To8L7, 4, sizeof(cl_int), &L7);
    if (err != CL_SUCCESS)
        throw"L7 clSetKernelArg error";
    //L8
    err = clSetKernelArg(kernelConv8To8L8, 0, sizeof(cl_mem), &imageBufferTmp11);
    err |= clSetKernelArg(kernelConv8To8L8, 1, sizeof(cl_mem), &imageBufferTmp21);
    err |= clSetKernelArg(kernelConv8To8L8, 2, sizeof(cl_mem), &imageBufferTmp12);
    err |= clSetKernelArg(kernelConv8To8L8, 3, sizeof(cl_mem), &imageBufferTmp22);
    err |= clSetKernelArg(kernelConv8To8L8, 4, sizeof(cl_int), &L8);
    if (err != CL_SUCCESS)
        throw"L8 clSetKernelArg error";
    //L9
    err = clSetKernelArg(kernelConv8To8L9, 0, sizeof(cl_mem), &imageBufferTmp12);
    err |= clSetKernelArg(kernelConv8To8L9, 1, sizeof(cl_mem), &imageBufferTmp22);
    err |= clSetKernelArg(kernelConv8To8L9, 2, sizeof(cl_mem), &imageBufferTmp11);
    err |= clSetKernelArg(kernelConv8To8L9, 3, sizeof(cl_mem), &imageBufferTmp21);
    err |= clSetKernelArg(kernelConv8To8L9, 4, sizeof(cl_int), &L9);
    if (err != CL_SUCCESS)
        throw"L9 clSetKernelArg error";
    //L10
    err = clSetKernelArg(kernelConvTranspose8To1L10, 0, sizeof(cl_mem), &imageBufferTmp11);
    err |= clSetKernelArg(kernelConvTranspose8To1L10, 1, sizeof(cl_mem), &imageBufferTmp21);
    err |= clSetKernelArg(kernelConvTranspose8To1L10, 2, sizeof(cl_mem), &imageBufferDst);
    if (err != CL_SUCCESS)
        throw"L10 clSetKernelArg error";

    clEnqueueWriteImage(commandQueue, imageBufferOrg, CL_FALSE, orgin, orgRegion, orgImage.step, 0, orgImage.data, 0, nullptr, nullptr);
    clEnqueueNDRangeKernel(commandQueue, kernelConv1To8L1, 2, nullptr, orgSize, nullptr, 0, nullptr, nullptr);
    clEnqueueNDRangeKernel(commandQueue, kernelConv8To8L2, 2, nullptr, orgSize, nullptr, 0, nullptr, nullptr);
    clEnqueueNDRangeKernel(commandQueue, kernelConv8To8L3, 2, nullptr, orgSize, nullptr, 0, nullptr, nullptr);
    clEnqueueNDRangeKernel(commandQueue, kernelConv8To8L4, 2, nullptr, orgSize, nullptr, 0, nullptr, nullptr);
    clEnqueueNDRangeKernel(commandQueue, kernelConv8To8L5, 2, nullptr, orgSize, nullptr, 0, nullptr, nullptr);
    clEnqueueNDRangeKernel(commandQueue, kernelConv8To8L6, 2, nullptr, orgSize, nullptr, 0, nullptr, nullptr);
    clEnqueueNDRangeKernel(commandQueue, kernelConv8To8L7, 2, nullptr, orgSize, nullptr, 0, nullptr, nullptr);
    clEnqueueNDRangeKernel(commandQueue, kernelConv8To8L8, 2, nullptr, orgSize, nullptr, 0, nullptr, nullptr);
    clEnqueueNDRangeKernel(commandQueue, kernelConv8To8L9, 2, nullptr, orgSize, nullptr, 0, nullptr, nullptr);
    clEnqueueNDRangeKernel(commandQueue, kernelConvTranspose8To1L10, 2, nullptr, dstSize, nullptr, 0, nullptr, nullptr);
    clEnqueueReadImage(commandQueue, imageBufferDst, CL_TRUE, orgin, dstRegion, dstImage.step, 0, dstImage.data, 0, nullptr, nullptr);

    //clean
    clReleaseMemObject(imageBufferOrg);
    clReleaseMemObject(imageBufferTmp11);
    clReleaseMemObject(imageBufferTmp21);
    clReleaseMemObject(imageBufferTmp12);
    clReleaseMemObject(imageBufferTmp22);
    clReleaseMemObject(imageBufferDst);

    clReleaseKernel(kernelConv1To8L1);
    clReleaseKernel(kernelConv8To8L2);
    clReleaseKernel(kernelConv8To8L3);
    clReleaseKernel(kernelConv8To8L4);
    clReleaseKernel(kernelConv8To8L5);
    clReleaseKernel(kernelConv8To8L6);
    clReleaseKernel(kernelConv8To8L7);
    clReleaseKernel(kernelConv8To8L8);
    clReleaseKernel(kernelConv8To8L9);
    clReleaseKernel(kernelConvTranspose8To1L10);

}

void Anime4KCPP::Anime4KGPUCNN::runKernelACNetHDN(cv::InputArray orgImg, cv::OutputArray dstImg)
{
    cl_int err;
    int i;

    cv::Mat orgImage = orgImg.getMat();
    cv::Mat dstImage = dstImg.getMat();

    cl_image_format format;
    cl_image_format tmpFormat;
    cl_image_desc dstDesc;
    cl_image_desc orgDesc;

    const size_t orgin[3] = { 0,0,0 };
    const size_t orgRegion[3] = { size_t(orgImage.cols),size_t(orgImage.rows),1 };
    const size_t dstRegion[3] = { size_t(dstImage.cols),size_t(dstImage.rows),1 };
    const size_t orgSize[2] = { size_t(orgImage.cols),size_t(orgImage.rows) };
    const size_t dstSize[2] = { size_t(dstImage.cols),size_t(dstImage.rows) };

    const cl_int L2 = 0, L3 = 1, L4 = 2, L5 = 3, L6 = 4, L7 = 5, L8 = 6, L9 = 7;

    //init frame
    format.image_channel_data_type = CL_UNORM_INT8;
    format.image_channel_order = CL_R;

    tmpFormat.image_channel_data_type = CL_FLOAT;
    tmpFormat.image_channel_order = CL_RGBA;

    orgDesc.image_type = CL_MEM_OBJECT_IMAGE2D;
    orgDesc.image_height = orgImage.rows;
    orgDesc.image_width = orgImage.cols;
    orgDesc.image_row_pitch = 0;
    orgDesc.image_slice_pitch = 0;
    orgDesc.num_mip_levels = 0;
    orgDesc.num_samples = 0;
    orgDesc.buffer = nullptr;

    dstDesc.image_type = CL_MEM_OBJECT_IMAGE2D;
    dstDesc.image_height = dstImage.rows;
    dstDesc.image_width = dstImage.cols;
    dstDesc.image_row_pitch = 0;
    dstDesc.image_slice_pitch = 0;
    dstDesc.num_mip_levels = 0;
    dstDesc.num_samples = 0;
    dstDesc.buffer = nullptr;

    cl_kernel kernelConv1To8L1 = clCreateKernel(programACNetHDN, "conv1To8", &err);
    if (err != CL_SUCCESS)
    {
        throw"Failed to create OpenCL kernel L1";
    }
    cl_kernel kernelConv8To8L2 = clCreateKernel(programACNetHDN, "conv8To8", &err);
    if (err != CL_SUCCESS)
    {
        clReleaseKernel(kernelConv1To8L1);
        throw"Failed to create OpenCL kernel L2";
    }
    cl_kernel kernelConv8To8L3 = clCreateKernel(programACNetHDN, "conv8To8", &err);
    if (err != CL_SUCCESS)
    {
        clReleaseKernel(kernelConv1To8L1);
        clReleaseKernel(kernelConv8To8L2);
        throw"Failed to create OpenCL kernel L3";
    }
    cl_kernel kernelConv8To8L4 = clCreateKernel(programACNetHDN, "conv8To8", &err);
    if (err != CL_SUCCESS)
    {
        clReleaseKernel(kernelConv1To8L1);
        clReleaseKernel(kernelConv8To8L2);
        clReleaseKernel(kernelConv8To8L3);
        throw"Failed to create OpenCL kernel L4";
    }
    cl_kernel kernelConv8To8L5 = clCreateKernel(programACNetHDN, "conv8To8", &err);
    if (err != CL_SUCCESS)
    {
        clReleaseKernel(kernelConv1To8L1);
        clReleaseKernel(kernelConv8To8L2);
        clReleaseKernel(kernelConv8To8L3);
        clReleaseKernel(kernelConv8To8L4);
        throw"Failed to create OpenCL kernel L5";
    }
    cl_kernel kernelConv8To8L6 = clCreateKernel(programACNetHDN, "conv8To8", &err);
    if (err != CL_SUCCESS)
    {
        clReleaseKernel(kernelConv1To8L1);
        clReleaseKernel(kernelConv8To8L2);
        clReleaseKernel(kernelConv8To8L3);
        clReleaseKernel(kernelConv8To8L4);
        clReleaseKernel(kernelConv8To8L5);
        throw"Failed to create OpenCL kernel L6";
    }
    cl_kernel kernelConv8To8L7 = clCreateKernel(programACNetHDN, "conv8To8", &err);
    if (err != CL_SUCCESS)
    {
        clReleaseKernel(kernelConv1To8L1);
        clReleaseKernel(kernelConv8To8L2);
        clReleaseKernel(kernelConv8To8L3);
        clReleaseKernel(kernelConv8To8L4);
        clReleaseKernel(kernelConv8To8L5);
        clReleaseKernel(kernelConv8To8L6);
        throw"Failed to create OpenCL kernel L7";
    }
    cl_kernel kernelConv8To8L8 = clCreateKernel(programACNetHDN, "conv8To8", &err);
    if (err != CL_SUCCESS)
    {
        clReleaseKernel(kernelConv1To8L1);
        clReleaseKernel(kernelConv8To8L2);
        clReleaseKernel(kernelConv8To8L3);
        clReleaseKernel(kernelConv8To8L4);
        clReleaseKernel(kernelConv8To8L5);
        clReleaseKernel(kernelConv8To8L6);
        clReleaseKernel(kernelConv8To8L7);
        throw"Failed to create OpenCL kernel L8";
    }
    cl_kernel kernelConv8To8L9 = clCreateKernel(programACNetHDN, "conv8To8", &err);
    if (err != CL_SUCCESS)
    {
        clReleaseKernel(kernelConv1To8L1);
        clReleaseKernel(kernelConv8To8L2);
        clReleaseKernel(kernelConv8To8L3);
        clReleaseKernel(kernelConv8To8L4);
        clReleaseKernel(kernelConv8To8L5);
        clReleaseKernel(kernelConv8To8L6);
        clReleaseKernel(kernelConv8To8L7);
        clReleaseKernel(kernelConv8To8L8);
        throw"Failed to create OpenCL kernel L9";
    }
    cl_kernel kernelConvTranspose8To1L10 = clCreateKernel(programACNetHDN, "convTranspose8To1", &err);
    if (err != CL_SUCCESS)
    {
        clReleaseKernel(kernelConv1To8L1);
        clReleaseKernel(kernelConv8To8L2);
        clReleaseKernel(kernelConv8To8L3);
        clReleaseKernel(kernelConv8To8L4);
        clReleaseKernel(kernelConv8To8L5);
        clReleaseKernel(kernelConv8To8L6);
        clReleaseKernel(kernelConv8To8L7);
        clReleaseKernel(kernelConv8To8L8);
        clReleaseKernel(kernelConv8To8L9);
        throw"Failed to create OpenCL kernel L10";
    }


    cl_mem imageBufferOrg = clCreateImage(context, CL_MEM_READ_ONLY, &format, &orgDesc, nullptr, &err);
    if (err != CL_SUCCESS)
    {
        throw"imageBufferOrg error";
    }

    cl_mem imageBufferTmp11 = clCreateImage(context, CL_MEM_READ_WRITE, &tmpFormat, &orgDesc, nullptr, &err);
    if (err != CL_SUCCESS)
    {
        clReleaseMemObject(imageBufferOrg);
        throw"imageBufferTmp11 error";
    }

    cl_mem imageBufferTmp21 = clCreateImage(context, CL_MEM_READ_WRITE, &tmpFormat, &orgDesc, nullptr, &err);
    if (err != CL_SUCCESS)
    {
        clReleaseMemObject(imageBufferOrg);
        clReleaseMemObject(imageBufferTmp11);
        throw"imageBufferTmp21 error";
    }

    cl_mem imageBufferTmp12 = clCreateImage(context, CL_MEM_READ_WRITE, &tmpFormat, &orgDesc, nullptr, &err);
    if (err != CL_SUCCESS)
    {
        clReleaseMemObject(imageBufferOrg);
        clReleaseMemObject(imageBufferTmp11);
        clReleaseMemObject(imageBufferTmp21);
        throw"imageBufferTmp12 error";
    }

    cl_mem imageBufferTmp22 = clCreateImage(context, CL_MEM_READ_WRITE, &tmpFormat, &orgDesc, nullptr, &err);
    if (err != CL_SUCCESS)
    {
        clReleaseMemObject(imageBufferOrg);
        clReleaseMemObject(imageBufferTmp11);
        clReleaseMemObject(imageBufferTmp21);
        clReleaseMemObject(imageBufferTmp12);
        throw"imageBufferTmp22 error";
    }

    cl_mem imageBufferDst = clCreateImage(context, CL_MEM_WRITE_ONLY, &format, &dstDesc, nullptr, &err);
    if (err != CL_SUCCESS)
    {
        clReleaseMemObject(imageBufferOrg);
        clReleaseMemObject(imageBufferTmp11);
        clReleaseMemObject(imageBufferTmp21);
        clReleaseMemObject(imageBufferTmp12);
        clReleaseMemObject(imageBufferTmp22);
        throw"imageBufferDst error";
    }

    //L1
    err = clSetKernelArg(kernelConv1To8L1, 0, sizeof(cl_mem), &imageBufferOrg);
    err |= clSetKernelArg(kernelConv1To8L1, 1, sizeof(cl_mem), &imageBufferTmp11);
    err |= clSetKernelArg(kernelConv1To8L1, 2, sizeof(cl_mem), &imageBufferTmp21);
    if (err != CL_SUCCESS)
        throw"L1 clSetKernelArg error";
    //L2
    err = clSetKernelArg(kernelConv8To8L2, 0, sizeof(cl_mem), &imageBufferTmp11);
    err |= clSetKernelArg(kernelConv8To8L2, 1, sizeof(cl_mem), &imageBufferTmp21);
    err |= clSetKernelArg(kernelConv8To8L2, 2, sizeof(cl_mem), &imageBufferTmp12);
    err |= clSetKernelArg(kernelConv8To8L2, 3, sizeof(cl_mem), &imageBufferTmp22);
    err |= clSetKernelArg(kernelConv8To8L2, 4, sizeof(cl_int), &L2);
    if (err != CL_SUCCESS)
        throw"L2 clSetKernelArg error";
    //L3
    err = clSetKernelArg(kernelConv8To8L3, 0, sizeof(cl_mem), &imageBufferTmp12);
    err |= clSetKernelArg(kernelConv8To8L3, 1, sizeof(cl_mem), &imageBufferTmp22);
    err |= clSetKernelArg(kernelConv8To8L3, 2, sizeof(cl_mem), &imageBufferTmp11);
    err |= clSetKernelArg(kernelConv8To8L3, 3, sizeof(cl_mem), &imageBufferTmp21);
    err |= clSetKernelArg(kernelConv8To8L3, 4, sizeof(cl_int), &L3);
    if (err != CL_SUCCESS)
        throw"L3 clSetKernelArg error";
    //L4
    err = clSetKernelArg(kernelConv8To8L4, 0, sizeof(cl_mem), &imageBufferTmp11);
    err |= clSetKernelArg(kernelConv8To8L4, 1, sizeof(cl_mem), &imageBufferTmp21);
    err |= clSetKernelArg(kernelConv8To8L4, 2, sizeof(cl_mem), &imageBufferTmp12);
    err |= clSetKernelArg(kernelConv8To8L4, 3, sizeof(cl_mem), &imageBufferTmp22);
    err |= clSetKernelArg(kernelConv8To8L4, 4, sizeof(cl_int), &L4);
    if (err != CL_SUCCESS)
        throw"L4 clSetKernelArg error";
    //L5
    err = clSetKernelArg(kernelConv8To8L5, 0, sizeof(cl_mem), &imageBufferTmp12);
    err |= clSetKernelArg(kernelConv8To8L5, 1, sizeof(cl_mem), &imageBufferTmp22);
    err |= clSetKernelArg(kernelConv8To8L5, 2, sizeof(cl_mem), &imageBufferTmp11);
    err |= clSetKernelArg(kernelConv8To8L5, 3, sizeof(cl_mem), &imageBufferTmp21);
    err |= clSetKernelArg(kernelConv8To8L5, 4, sizeof(cl_int), &L5);
    if (err != CL_SUCCESS)
        throw"L5 clSetKernelArg error";
    //L6
    err = clSetKernelArg(kernelConv8To8L6, 0, sizeof(cl_mem), &imageBufferTmp11);
    err |= clSetKernelArg(kernelConv8To8L6, 1, sizeof(cl_mem), &imageBufferTmp21);
    err |= clSetKernelArg(kernelConv8To8L6, 2, sizeof(cl_mem), &imageBufferTmp12);
    err |= clSetKernelArg(kernelConv8To8L6, 3, sizeof(cl_mem), &imageBufferTmp22);
    err |= clSetKernelArg(kernelConv8To8L6, 4, sizeof(cl_int), &L6);
    if (err != CL_SUCCESS)
        throw"L6 clSetKernelArg error";
    //L7
    err = clSetKernelArg(kernelConv8To8L7, 0, sizeof(cl_mem), &imageBufferTmp12);
    err |= clSetKernelArg(kernelConv8To8L7, 1, sizeof(cl_mem), &imageBufferTmp22);
    err |= clSetKernelArg(kernelConv8To8L7, 2, sizeof(cl_mem), &imageBufferTmp11);
    err |= clSetKernelArg(kernelConv8To8L7, 3, sizeof(cl_mem), &imageBufferTmp21);
    err |= clSetKernelArg(kernelConv8To8L7, 4, sizeof(cl_int), &L7);
    if (err != CL_SUCCESS)
        throw"L7 clSetKernelArg error";
    //L8
    err = clSetKernelArg(kernelConv8To8L8, 0, sizeof(cl_mem), &imageBufferTmp11);
    err |= clSetKernelArg(kernelConv8To8L8, 1, sizeof(cl_mem), &imageBufferTmp21);
    err |= clSetKernelArg(kernelConv8To8L8, 2, sizeof(cl_mem), &imageBufferTmp12);
    err |= clSetKernelArg(kernelConv8To8L8, 3, sizeof(cl_mem), &imageBufferTmp22);
    err |= clSetKernelArg(kernelConv8To8L8, 4, sizeof(cl_int), &L8);
    if (err != CL_SUCCESS)
        throw"L8 clSetKernelArg error";
    //L9
    err = clSetKernelArg(kernelConv8To8L9, 0, sizeof(cl_mem), &imageBufferTmp12);
    err |= clSetKernelArg(kernelConv8To8L9, 1, sizeof(cl_mem), &imageBufferTmp22);
    err |= clSetKernelArg(kernelConv8To8L9, 2, sizeof(cl_mem), &imageBufferTmp11);
    err |= clSetKernelArg(kernelConv8To8L9, 3, sizeof(cl_mem), &imageBufferTmp21);
    err |= clSetKernelArg(kernelConv8To8L9, 4, sizeof(cl_int), &L9);
    if (err != CL_SUCCESS)
        throw"L9 clSetKernelArg error";
    //L10
    err = clSetKernelArg(kernelConvTranspose8To1L10, 0, sizeof(cl_mem), &imageBufferTmp11);
    err |= clSetKernelArg(kernelConvTranspose8To1L10, 1, sizeof(cl_mem), &imageBufferTmp21);
    err |= clSetKernelArg(kernelConvTranspose8To1L10, 2, sizeof(cl_mem), &imageBufferDst);
    if (err != CL_SUCCESS)
        throw"L10 clSetKernelArg error";

    clEnqueueWriteImage(commandQueue, imageBufferOrg, CL_FALSE, orgin, orgRegion, orgImage.step, 0, orgImage.data, 0, nullptr, nullptr);
    clEnqueueNDRangeKernel(commandQueue, kernelConv1To8L1, 2, nullptr, orgSize, nullptr, 0, nullptr, nullptr);
    clEnqueueNDRangeKernel(commandQueue, kernelConv8To8L2, 2, nullptr, orgSize, nullptr, 0, nullptr, nullptr);
    clEnqueueNDRangeKernel(commandQueue, kernelConv8To8L3, 2, nullptr, orgSize, nullptr, 0, nullptr, nullptr);
    clEnqueueNDRangeKernel(commandQueue, kernelConv8To8L4, 2, nullptr, orgSize, nullptr, 0, nullptr, nullptr);
    clEnqueueNDRangeKernel(commandQueue, kernelConv8To8L5, 2, nullptr, orgSize, nullptr, 0, nullptr, nullptr);
    clEnqueueNDRangeKernel(commandQueue, kernelConv8To8L6, 2, nullptr, orgSize, nullptr, 0, nullptr, nullptr);
    clEnqueueNDRangeKernel(commandQueue, kernelConv8To8L7, 2, nullptr, orgSize, nullptr, 0, nullptr, nullptr);
    clEnqueueNDRangeKernel(commandQueue, kernelConv8To8L8, 2, nullptr, orgSize, nullptr, 0, nullptr, nullptr);
    clEnqueueNDRangeKernel(commandQueue, kernelConv8To8L9, 2, nullptr, orgSize, nullptr, 0, nullptr, nullptr);
    clEnqueueNDRangeKernel(commandQueue, kernelConvTranspose8To1L10, 2, nullptr, dstSize, nullptr, 0, nullptr, nullptr);
    clEnqueueReadImage(commandQueue, imageBufferDst, CL_TRUE, orgin, dstRegion, dstImage.step, 0, dstImage.data, 0, nullptr, nullptr);

    //clean
    clReleaseMemObject(imageBufferOrg);
    clReleaseMemObject(imageBufferTmp11);
    clReleaseMemObject(imageBufferTmp21);
    clReleaseMemObject(imageBufferTmp12);
    clReleaseMemObject(imageBufferTmp22);
    clReleaseMemObject(imageBufferDst);

    clReleaseKernel(kernelConv1To8L1);
    clReleaseKernel(kernelConv8To8L2);
    clReleaseKernel(kernelConv8To8L3);
    clReleaseKernel(kernelConv8To8L4);
    clReleaseKernel(kernelConv8To8L5);
    clReleaseKernel(kernelConv8To8L6);
    clReleaseKernel(kernelConv8To8L7);
    clReleaseKernel(kernelConv8To8L8);
    clReleaseKernel(kernelConv8To8L9);
    clReleaseKernel(kernelConvTranspose8To1L10);

}

void Anime4KCPP::Anime4KGPUCNN::initOpenCL(const CNNType type)
{
    cl_int err = 0;
    cl_uint platforms = 0;
    cl_uint devices = 0;
    cl_platform_id currentplatform = nullptr;

    //init platform
    err = clGetPlatformIDs(0, nullptr, &platforms);
    if (err != CL_SUCCESS || !platforms)
    {
        std::cout << err << std::endl;
        throw"Failed to find OpenCL platform";
    }

    cl_platform_id* tmpPlatform = new cl_platform_id[platforms];
    err = clGetPlatformIDs(platforms, tmpPlatform, nullptr);
    if (err != CL_SUCCESS)
    {
        std::cout << err << std::endl;
        delete[] tmpPlatform;
        throw"Failed to get OpenCL platform";
    }


    if (pID >= 0 && pID < platforms)
        currentplatform = tmpPlatform[pID];
    else
        currentplatform = tmpPlatform[0];

    delete[] tmpPlatform;

    //init device
    err = clGetDeviceIDs(currentplatform, CL_DEVICE_TYPE_GPU, 0, nullptr, &devices);
    if (err != CL_SUCCESS || !devices)
    {
        std::cout << err << std::endl;
        throw"Failed to find supported GPU";
    }

    cl_device_id* tmpDevice = new cl_device_id[devices];
    err = clGetDeviceIDs(currentplatform, CL_DEVICE_TYPE_GPU, devices, tmpDevice, nullptr);
    if (err != CL_SUCCESS)
    {
        std::cout << err << std::endl;
        delete[] tmpDevice;
        throw"GPU initialization error";
    }

    if (dID >= 0 && dID < devices)
        device = tmpDevice[dID];
    else
        device = tmpDevice[0];

    delete[] tmpDevice;

    //init context
    context = clCreateContext(nullptr, 1, &device, nullptr, nullptr, &err);
    if (err != CL_SUCCESS)
    {
        std::cout << err << std::endl;
        releaseOpenCL();
        throw"Failed to create context";
    }

    //init command queue

#ifndef CL_VERSION_2_0 //for OpenCL SDK older than v2.0 to build
    commandQueue = clCreateCommandQueue(context, device, 0, &err);
    if (err != CL_SUCCESS)
    {
        std::cout << err << std::endl;
        releaseOpenCL();
        throw"Failed to create command queue";
    }
#else
    commandQueue = clCreateCommandQueueWithProperties(context, device, nullptr, &err);
    if (err != CL_SUCCESS)
    {
        if (err == CL_INVALID_DEVICE)//for GPUs that only support OpenCL1.2
        {
#ifdef _MSC_VER
#pragma warning (disable: 4996)// this is for building in MSVC
#endif // _MSCV_VER
            //do not worry about this warning, it is for compatibility
            commandQueue = clCreateCommandQueue(context, device, 0, &err);
            if (err != CL_SUCCESS)
            {
                std::cout << err << std::endl;
                releaseOpenCL();
                throw"Failed to create command queue";
            }
        }
        else
        {
            std::cout << err << std::endl;
            releaseOpenCL();
            throw"Failed to create command queue";
        }
    }
#endif // SPECIAL OPENCL VERSION

#ifndef BUILT_IN_KERNEL
    //read kernel files
    std::string ACNetKernelSourceString;
    std::string ACNetHDNKernelSourceString;
#endif // BUILT_IN_KERNEL
    const char* ACNetKernelSource;
    const char* ACNetHDNKernelSource;

    switch (type)
    {
    case CNNType::ACNet:
#ifndef BUILT_IN_KERNEL
        //read kernel files
        ACNetKernelSourceString = readKernel("ACNetKernel.cl");
#endif // BUILT_IN_KERNEL
        ACNetKernelSource = ACNetKernelSourceString.c_str();

        //create program
        programACNet = clCreateProgramWithSource(context, 1, &ACNetKernelSource, nullptr, &err);
        if (err != CL_SUCCESS)
        {
            std::cout << err << std::endl;
            releaseOpenCL();
            throw"Failed to create OpenCL program";
        }

        //build program
        err = clBuildProgram(programACNet, 1, &device, nullptr, nullptr, nullptr);
        if (err != CL_SUCCESS)
        {
            size_t buildErrorSize = 0;
            clGetProgramBuildInfo(programACNet, device, CL_PROGRAM_BUILD_LOG, 0, nullptr, &buildErrorSize);
            char* buildError = new char[buildErrorSize];
            clGetProgramBuildInfo(programACNet, device, CL_PROGRAM_BUILD_LOG, buildErrorSize, buildError, nullptr);
            releaseOpenCL();
            //print build info
            std::cout << buildError << std::endl;
            delete[] buildError;
            throw"Kernel build error";
        }
        break;
    case CNNType::ACNetHDN:
#ifndef BUILT_IN_KERNEL
        //read kernel files
        ACNetHDNKernelSourceString = readKernel("ACNetHDNKernel.cl");
#endif // BUILT_IN_KERNEL
        ACNetHDNKernelSource = ACNetHDNKernelSourceString.c_str();

        //create program
        programACNetHDN = clCreateProgramWithSource(context, 1, &ACNetHDNKernelSource, nullptr, &err);
        if (err != CL_SUCCESS)
        {
            std::cout << err << std::endl;
            releaseOpenCL();
            throw"Failed to create OpenCL program";
        }

        //build program
        err = clBuildProgram(programACNetHDN, 1, &device, nullptr, nullptr, nullptr);
        if (err != CL_SUCCESS)
        {
            size_t buildErrorSize = 0;
            clGetProgramBuildInfo(programACNetHDN, device, CL_PROGRAM_BUILD_LOG, 0, nullptr, &buildErrorSize);
            char* buildError = new char[buildErrorSize];
            clGetProgramBuildInfo(programACNetHDN, device, CL_PROGRAM_BUILD_LOG, buildErrorSize, buildError, nullptr);
            releaseOpenCL();
            //print build info
            std::cout << buildError << std::endl;
            delete[] buildError;
            throw"Kernel build error";
        }
        break;
    case CNNType::Default:
#ifndef BUILT_IN_KERNEL
        //read kernel files
        ACNetKernelSourceString = readKernel("ACNetKernel.cl");
        ACNetHDNKernelSourceString = readKernel("ACNetHDNKernel.cl");
#endif // BUILT_IN_KERNEL
        ACNetKernelSource = ACNetKernelSourceString.c_str();
        ACNetHDNKernelSource = ACNetHDNKernelSourceString.c_str();

        //create programACNet
        programACNet = clCreateProgramWithSource(context, 1, &ACNetKernelSource, nullptr, &err);
        if (err != CL_SUCCESS)
        {
            std::cout << err << std::endl;
            releaseOpenCL();
            throw"Failed to create OpenCL program";
        }

        //build programACNet
        err = clBuildProgram(programACNet, 1, &device, nullptr, nullptr, nullptr);
        if (err != CL_SUCCESS)
        {
            size_t buildErrorSize = 0;
            clGetProgramBuildInfo(programACNet, device, CL_PROGRAM_BUILD_LOG, 0, nullptr, &buildErrorSize);
            char* buildError = new char[buildErrorSize];
            clGetProgramBuildInfo(programACNet, device, CL_PROGRAM_BUILD_LOG, buildErrorSize, buildError, nullptr);
            releaseOpenCL();
            //print build info
            std::cout << buildError << std::endl;
            delete[] buildError;
            throw"Kernel build error";
        }

        //create programACNetHDN
        programACNetHDN = clCreateProgramWithSource(context, 1, &ACNetHDNKernelSource, nullptr, &err);
        if (err != CL_SUCCESS)
        {
            std::cout << err << std::endl;
            releaseOpenCL();
            throw"Failed to create OpenCL program";
        }

        //build programACNetHDN
        err = clBuildProgram(programACNetHDN, 1, &device, nullptr, nullptr, nullptr);
        if (err != CL_SUCCESS)
        {
            size_t buildErrorSize = 0;
            clGetProgramBuildInfo(programACNetHDN, device, CL_PROGRAM_BUILD_LOG, 0, nullptr, &buildErrorSize);
            char* buildError = new char[buildErrorSize];
            clGetProgramBuildInfo(programACNetHDN, device, CL_PROGRAM_BUILD_LOG, buildErrorSize, buildError, nullptr);
            releaseOpenCL();
            //print build info
            std::cout << buildError << std::endl;
            delete[] buildError;
            throw"Kernel build error";
        }
        break;
    }
}

void Anime4KCPP::Anime4KGPUCNN::releaseOpenCL()
{
    if (programACNet != nullptr)
        clReleaseProgram(programACNet);
    if (programACNetHDN != nullptr)
        clReleaseProgram(programACNetHDN);
    if (commandQueue != nullptr)
        clReleaseCommandQueue(commandQueue);
    if (context != nullptr)
        clReleaseContext(context);
    if (device != nullptr)
        clReleaseDevice(device);
}

std::string Anime4KCPP::Anime4KGPUCNN::readKernel(const std::string& fileName)
{
    std::ifstream kernelFile(fileName);
    if (!kernelFile.is_open())
        throw"Read kernel error";
    std::ostringstream source;
    source << kernelFile.rdbuf();
    return std::string(source.str());
}

Anime4KCPP::ProcessorType Anime4KCPP::Anime4KGPUCNN::getProcessorType()
{
    return ProcessorType::GPUCNN;
}

//init OpenCL arguments
bool Anime4KCPP::Anime4KGPUCNN::isInitialized = false;
cl_context Anime4KCPP::Anime4KGPUCNN::context = nullptr;
cl_command_queue Anime4KCPP::Anime4KGPUCNN::commandQueue = nullptr;
cl_program Anime4KCPP::Anime4KGPUCNN::programACNet = nullptr;
cl_program Anime4KCPP::Anime4KGPUCNN::programACNetHDN = nullptr;
cl_device_id Anime4KCPP::Anime4KGPUCNN::device = nullptr;
unsigned int Anime4KCPP::Anime4KGPUCNN::pID = 0U;
unsigned int Anime4KCPP::Anime4KGPUCNN::dID = 0U;

#ifdef BUILT_IN_KERNEL
const std::string Anime4KCPP::Anime4KGPUCNN::ACNetKernelSourceString = 
R"(#define RELU(x) fmax(x, 0.0f)

__constant sampler_t samplerN = CLK_NORMALIZED_COORDS_FALSE | CLK_ADDRESS_CLAMP | CLK_FILTER_NEAREST;

__constant float kernelsL1[9 * 8] = 
{
 0.0609,  0.1027, -0.0447,
-0.1423,  0.7196,  0.1803,
 0.0842,  0.0696,  0.0082,
 0.0089,  0.1540, -0.8589,
 0.0448,  0.8659, -0.2420,
-0.0364,  0.0585,  0.0125,
-0.1937,  0.7259,  0.0119,
-0.8266,  0.4147,  0.0088,
-0.0453, -0.0451, -0.0182,
 0.0264, -0.9422,  0.1258,
-0.0543,  0.1282,  0.7102,
-0.0106,  0.0386, -0.0141,
 0.2054, -0.0393,  0.1494,
 0.3106,  0.5722,  0.2640,
 0.1708, -0.1640, -0.0212,
 0.0558, -0.2887, -0.1666,
 0.3123, -0.3097, -0.2281,
 0.2880,  0.3001,  0.0526,
-0.0320,  0.0584, -0.0193,
-0.0135,  1.0649, -0.1246,
 0.0283, -0.3030, -0.6378,
-0.0040, -0.9122,  0.0181,
 0.0365,  0.8947, -0.0420,
-0.0199,  0.0217,  0.0060
};

__constant float biasL1[8] = 
{
-0.7577, -0.0210,  0.0292, -0.0189,  0.0223,  0.0340,  0.0150, -0.0044
};
)"
R"(
__constant float kernelsL[8][9 * 8 * 8] = 
{
{
 2.0611e-01,  6.6865e-02, -9.9123e-02,
 8.5279e-02, -4.5549e-02, -2.9491e-02,
-1.0358e-01, -2.4844e-02, -8.1539e-03,
-1.1308e-01, -6.4228e-02, -8.8081e-02,
 2.7810e-02, -1.6054e-01, -1.1985e-01,
-2.8679e-01, -1.7785e-02,  1.1559e-01,
 2.1614e-02, -6.8870e-02, -2.4707e-01,
 9.6867e-02, -1.6561e-01,  2.8281e-02,
-8.2469e-02, -9.8554e-02, -1.7147e-02,
 3.3710e-01,  9.2126e-02,  3.6880e-02,
 5.7004e-02,  4.0175e-02,  1.6116e-01,
 2.5629e-01,  5.1154e-01,  2.4119e-02,
 1.9495e-02,  2.6940e-01, -1.4050e-01,
 5.0325e-02, -4.5920e-02, -1.3586e-01,
 5.9458e-02,  1.3860e-01, -2.1065e-01,
-1.0744e-01, -1.5915e-01, -1.1528e-02,
-1.1470e-01,  6.3455e-02, -5.5558e-02,
-6.9920e-02, -3.0142e-02, -4.9059e-02,
 3.6421e-01,  3.0252e-01, -1.3562e-01,
 1.5238e-01, -1.9868e-01, -3.2644e-02,
-4.2849e-02,  1.3677e-02,  7.3854e-02,
 7.6609e-02, -1.0121e-01,  3.6319e-02,
 9.3536e-02,  6.0386e-02,  1.0086e-01,
-2.6630e-01,  2.5875e-02, -1.9225e-01,
 4.0687e-02,  1.1005e-01,  9.9578e-03,
 1.6939e-01,  5.0872e-01,  8.9876e-02,
 6.9561e-02,  1.1910e-01, -1.8091e-02,
-3.5739e-02, -7.5300e-02, -1.6788e-02,
 3.0316e-02,  1.5942e-01, -9.0878e-02,
-6.3737e-02,  2.6141e-02,  8.8040e-03,
 3.4954e-03, -6.6707e-02,  1.4551e-01,
 7.6258e-02,  1.4893e-01, -1.5255e-01,
 6.2442e-02,  2.2166e-01,  7.5327e-02,
 5.4785e-02, -1.4503e-02, -1.5188e-03,
 1.6748e-01, -5.2731e-03, -1.9900e-02,
 4.4786e-02, -1.0669e-01,  1.3192e-01,
 1.9961e-02, -8.1015e-02, -3.2264e-02,
 1.0544e-01,  1.8844e-01,  7.4274e-03,
 6.6729e-02, -7.8318e-02,  3.0775e-02,
-8.6109e-03,  7.4977e-02,  9.4079e-02,
-1.2726e-01, -2.9664e-01,  7.8153e-03,
-4.8413e-02, -1.8450e-01, -7.1065e-02,
-8.7609e-02, -7.7192e-02,  5.0919e-02,
-1.4021e-01,  3.5696e-01,  1.2079e-02,
-2.0318e-02, -1.8827e-02,  3.9084e-02,
-2.8654e-02, -6.4166e-02,  5.4889e-02,
 8.2689e-02,  8.4463e-02,  2.2339e-02,
 1.0805e-01, -1.2566e-01,  1.7109e-01,
-6.1338e-02, -3.4043e-02,  4.0473e-02,
 6.3821e-02,  1.7626e-01, -5.8112e-02,
-9.5002e-02,  1.3327e-02,  1.2242e-01,
 4.9008e-02, -4.3678e-02,  2.2362e-02,
-7.7903e-02, -3.8252e-02, -5.2271e-02,
-1.8884e-02, -1.2859e-01,  4.1172e-02,
-3.1181e-02,  3.2348e-02, -4.9081e-02,
-6.7966e-02, -2.4896e-02, -6.5323e-02,
 8.0742e-02,  2.6093e-01, -2.4638e-01,
-8.0881e-02, -2.9643e-02, -7.9627e-02,
 1.4020e-01,  2.1575e-01,  8.1244e-03,
 2.1561e-01, -2.9305e-01, -2.5535e-02,
-8.5538e-02, -1.4456e-01, -7.5664e-02,
-3.9921e-02,  4.0659e-02,  1.7812e-01,
 1.1580e-01,  5.6628e-02,  9.0008e-02,
-2.2384e-02, -1.9788e-02, -4.0547e-02,
 1.0070e-01,  2.9581e-01,  1.9936e-01,
-1.1957e-01, -8.6508e-02, -8.2543e-04,
-5.2879e-02,  1.5486e-01,  1.0829e-02,
 1.4716e-01,  3.4257e-01, -3.2058e-03,
-2.1687e-02,  5.8641e-02, -6.3806e-02,
-3.2607e-02,  7.3328e-02, -6.4738e-03,
-1.0031e-01, -1.7698e-01, -9.4201e-02,
-3.3644e-02, -3.5860e-01, -9.3200e-02,
-7.4142e-02,  5.5001e-02,  4.3741e-02,
-2.2447e-03,  1.1941e-01, -1.6135e-02,
-1.4764e-02, -1.0194e-02,  3.2540e-02,
-1.0588e-01, -2.3000e-01, -1.1557e-02,
-9.0254e-02,  2.3352e-01, -1.3622e-01,
-1.9256e-03, -5.3372e-02,  1.0314e-01,
-2.0100e-02,  1.0700e-01,  1.6108e-01,
 2.8422e-02,  2.7909e-01,  3.8342e-01,
 1.4025e-02,  9.0965e-02,  2.0218e-01,
 3.3562e-03,  7.6652e-02,  4.5974e-02,
-1.3617e-02, -1.4014e-01, -1.9253e-02,
 1.1020e-01, -1.9678e-01,  6.7123e-02,
-3.3294e-02, -1.3006e-01, -1.0111e-01,
 5.5813e-02,  2.1127e-01,  2.0248e-02,
-9.6386e-04, -5.2497e-03,  1.1134e-01,
 2.8910e-02,  1.2229e-01,  1.8439e-01,
 1.6413e-02,  1.5870e-01, -1.1616e-01,
-1.6032e-03, -6.8258e-03, -2.1883e-02,
 1.2052e-01, -2.1982e-02, -1.3088e-01,
 2.8664e-02, -5.0670e-02,  2.2927e-01,
 2.0461e-02,  7.7250e-03, -2.6630e-02,
-9.0406e-02, -1.4174e-01,  9.8969e-02,
-6.6573e-02, -2.4425e-01, -3.5126e-02,
 9.3859e-02,  1.9058e-01, -1.6569e-01,
-4.9163e-03,  7.4149e-02,  6.3345e-02,
-1.7888e-02, -9.1876e-02,  1.3728e-01,
-9.6098e-02, -3.4814e-02, -1.0862e-02,
 4.8031e-03,  2.5206e-01,  8.0316e-02,
 1.5102e-01,  4.1236e-02,  2.2339e-01,
 2.8500e-01,  1.5106e-01,  9.6321e-04,
-6.0741e-02,  3.5759e-02, -1.8829e-01,
-1.1295e-03, -6.2322e-02,  8.4974e-01,
-3.9817e-02, -2.0666e-01,  2.2961e-01,
 3.6857e-02, -2.0211e-02, -9.3342e-02,
 2.0827e-02,  6.8874e-02, -6.0287e-02,
-6.9724e-02,  1.4423e-01, -7.6017e-02,
 1.4718e-02,  1.8990e-01,  1.1789e-01,
-1.5018e-01, -2.3071e-01,  1.7511e-01,
-7.7605e-02,  5.0621e-02, -1.0381e-01,
 8.6845e-02, -1.2410e-01, -4.4669e-01,
 2.7930e-02, -5.4713e-02, -7.7923e-02,
 8.6000e-02, -2.6371e-02, -8.6541e-02,
-1.1521e-01,  1.4389e-01,  5.0507e-02,
-1.6618e-02, -2.5150e-01, -4.9759e-02,
 7.7166e-02,  4.5033e-03, -5.4649e-02,
 2.8548e-03, -2.8078e-03,  8.1129e-02,
-4.5973e-02,  3.6740e-03,  2.0746e-01,
-9.8191e-02,  1.2807e-01,  8.1950e-03,
 1.4240e-01,  1.5104e-01,  6.9624e-02,
 2.2309e-01,  2.5688e-01,  9.4766e-02,
 6.2560e-02,  7.1347e-02,  4.1432e-02,
-3.1829e-02,  1.5207e-01,  2.0575e-02,
-1.2506e-01,  2.9274e-01,  9.4712e-02,
-2.0520e-01,  4.9894e-04,  5.6171e-02,
-4.1567e-03,  6.6753e-02, -1.5767e-01,
 6.3768e-02,  8.3008e-02, -3.5639e-01,
 4.4660e-02,  2.6996e-01, -6.4014e-02,
 8.5475e-02,  1.7854e-02, -6.4079e-02,
 1.8760e-01,  1.5285e-01, -3.5614e-02,
 1.0747e-02, -3.1330e-01, -4.8664e-02,
 7.2150e-02,  1.7570e-01,  1.6716e-01,
 6.2431e-02,  2.3755e-01,  2.8554e-01,
 3.5791e-02,  2.8185e-01,  1.5810e-01,
-4.0886e-02,  1.8833e-02, -8.2903e-03,
 1.3994e-02, -1.0846e-01,  3.5315e-02,
-6.2674e-02,  6.2806e-02,  2.2168e-02,
-3.6236e-01, -2.5326e-01,  5.6331e-02,
 9.8762e-02,  3.8049e-01,  5.9885e-02,
-3.0541e-02,  7.9855e-02, -5.8639e-02,
 1.1104e-03,  1.7147e-02,  3.3115e-02,
-3.3663e-02,  7.4615e-02,  6.4211e-02,
-7.3441e-02, -1.5568e-01,  7.6546e-02,
 6.1802e-02, -1.5300e-01, -1.8209e-02,
-9.2786e-03,  1.6622e-01,  1.1354e-01,
 9.5865e-03, -2.4226e-02, -1.4750e-03,
-5.5294e-02, -1.1839e-01,  3.8867e-03,
 1.7262e-01,  4.2743e-01,  6.8970e-02,
-2.0232e-01, -1.4564e-01,  2.3025e-02,
-2.6139e-03, -1.6907e-02,  1.1693e-01,
-9.4871e-03,  3.8488e-02, -4.8351e-02,
-9.2171e-02,  4.8227e-02,  9.7378e-02,
-1.0292e-01, -1.2084e-01, -9.6676e-02,
 1.8103e-02,  3.0658e-01, -7.7755e-02,
-2.4362e-02, -1.9862e-01, -6.9665e-02,
 8.2944e-03, -1.4680e-01, -1.7371e-02,
-1.6534e-01,  2.5752e-01,  1.1129e-01,
-9.4151e-02, -1.3225e-01,  1.5933e-01,
 9.0723e-02,  5.5469e-02, -1.4091e-01,
 8.3404e-02,  1.3741e-01, -3.5438e-02,
 3.2681e-02,  2.8491e-02,  1.4278e-02,
 2.3789e-01, -2.3687e-03, -5.3264e-03,
-1.1161e-01,  1.9351e-02,  5.0832e-02,
 8.2246e-03,  2.9892e-02, -3.7197e-02,
 4.8236e-02,  1.6945e-01,  1.3673e-01,
 1.1236e-01,  7.2318e-01, -4.1618e-02,
 2.7494e-01,  1.0081e-01, -8.5399e-03,
-5.6151e-02,  8.1212e-02, -7.5770e-02,
 2.7872e-02,  9.4644e-02,  1.1175e-02,
-6.1539e-02,  7.7395e-02, -3.2495e-02,
-5.1640e-02,  2.1028e-03,  1.5825e-02,
-1.1004e-01,  2.3153e-01, -6.1653e-02,
-2.6497e-02,  5.9461e-01,  4.0865e-02,
-1.9956e-02,  7.9328e-02, -1.7002e-02,
-5.5930e-03,  5.2015e-02,  7.7945e-04,
 1.0136e-02, -9.0111e-02, -1.1175e-01,
-3.1781e-02,  1.4686e-01, -7.5718e-03,
 1.1036e-02,  2.4618e-01,  8.5951e-02,
 3.4775e-02, -1.2184e-01,  1.8010e-01,
-3.6781e-02, -1.3912e-01, -4.9172e-02,
 3.3064e-02,  5.0582e-01,  1.0713e-02,
-1.2934e-02, -1.7697e-01, -1.4954e-01,
 2.2229e-02, -5.8568e-03, -5.0186e-02,
 1.9648e-02, -1.1302e-01,  1.5629e-02,
-3.5015e-02,  9.5032e-02, -2.9677e-02,
 9.5173e-02, -3.0330e-02, -3.7652e-02,
-2.6097e-03,  7.4723e-01, -7.6234e-03,
-3.8826e-02,  1.0191e-01,  3.6589e-03,
-2.6503e-02, -1.1133e-01, -2.2029e-02,
-1.9101e-01, -2.1108e-01, -7.4371e-02,
-7.9349e-02, -1.0405e-01,  5.0315e-02
}
,)"
R"(
{
-4.2606e-02, -8.9001e-02, -6.4006e-02,
 1.1132e-01,  7.6609e-02,  8.6417e-02,
 7.6477e-03, -1.6416e-02, -8.2094e-02,
 1.0779e-01,  2.1837e-01,  1.8094e-01,
-2.6306e-02, -1.2452e-01,  1.2662e-02,
 3.1633e-02,  1.8717e-02,  3.1043e-02,
 4.0927e-02,  5.0311e-02,  1.1648e-01,
 2.2429e-01,  2.0757e-01,  4.3662e-03,
 3.6341e-02, -4.7637e-02,  8.3645e-02,
-8.9260e-03,  1.8507e-02,  7.9069e-02,
-1.9411e-01, -8.6847e-02, -3.6639e-03,
 4.0328e-02, -3.6821e-02, -8.5387e-02,
 5.8173e-02,  5.9991e-02, -3.1398e-02,
 1.5818e-01,  3.0861e-01, -2.3818e-02,
 1.2176e-01,  6.7520e-02,  8.9401e-02,
-2.8859e-02, -1.2237e-01, -1.0625e-01,
 3.1675e-02,  1.4172e-01, -1.4373e-01,
 1.4653e-02,  1.0205e-01,  6.2557e-02,
-8.7292e-02, -2.1255e-02,  3.6830e-02,
-5.4417e-02,  3.0501e-01,  1.6897e-01,
-2.2187e-02, -8.9609e-02, -2.2830e-02,
 4.9846e-02,  3.3395e-01, -3.1561e-02,
-1.3191e-02,  4.2663e-01, -6.9727e-02,
 1.4570e-02, -4.0002e-02,  5.6394e-02,
-8.2547e-02,  1.9249e-01,  1.5591e-01,
 1.4536e-01, -1.0409e-01,  1.2382e-01,
 1.8189e-01,  9.2917e-02, -1.4394e-01,
-5.6260e-02, -2.7043e-01,  1.5392e-02,
-1.4305e-02,  1.1131e-01, -8.5913e-02,
 7.7914e-02, -6.5484e-03, -1.8375e-01,
-1.4059e-01, -5.7339e-01, -3.9073e-02,
-1.1701e-01, -3.1806e-02,  7.7726e-02,
 2.1688e-02,  9.9297e-02,  3.8224e-02,
 7.9884e-02,  5.2461e-02,  1.0318e-01,
 4.0054e-02,  1.4695e-01,  1.2577e-01,
-1.8790e-03, -4.9421e-02,  2.3235e-02,
-8.9820e-02, -1.6994e-01, -1.5986e-01,
 2.3436e-01, -1.5346e-01,  1.5014e-02,
-3.9139e-02, -7.9388e-02, -4.9057e-02,
-1.1193e-01, -2.5705e-01,  1.1995e-01,
 5.7929e-02,  2.4988e-01, -4.9406e-03,
-3.9363e-02, -1.1691e-02, -1.2236e-03,
-2.0521e-01,  2.1901e-01,  1.5957e-01,
 2.1062e-01, -1.4157e-01, -3.4340e-01,
 3.8520e-02, -2.0820e-01,  2.4570e-03,
 1.7211e-01,  2.0214e-01,  1.3821e-01,
-7.1520e-02,  1.4847e-01, -1.3820e-01,
-2.4712e-02, -1.5925e-02,  1.7403e-02,
-3.7515e-02,  3.0461e-02, -2.7543e-02,
 8.6148e-02, -6.1486e-02,  1.2610e-02,
 2.9748e-03,  1.1778e-01,  2.9032e-02,
-2.1706e-02, -2.2406e-02,  2.6769e-02,
-3.6965e-02,  2.2180e-01, -4.0929e-02,
-3.2629e-03,  8.3419e-02, -1.4587e-01,
-1.3909e-02, -2.0166e-02, -1.0029e-01,
 7.6360e-02,  8.0819e-02, -1.0933e-01,
-5.8919e-02,  2.4745e-02,  3.7375e-02,
-1.1333e-02,  1.4747e-02, -7.8958e-02,
-3.1535e-02,  1.7403e-01,  1.3946e-02,
-3.2038e-02,  5.1151e-02, -6.1063e-02,
-8.6472e-03, -6.9689e-02,  5.6846e-03,
 5.7914e-02, -1.9818e-01, -7.5321e-02,
 8.7453e-02,  7.8354e-02,  2.1997e-02,
-4.7606e-02,  1.3915e-01,  1.1653e-01,
 9.6050e-02,  4.0099e-01,  1.5631e-01,
 3.1492e-02,  2.4797e-01,  6.8716e-02,
-6.2664e-03,  9.1754e-02, -5.7244e-03,
 1.3538e-01,  1.5366e-01,  9.4916e-02,
-4.2115e-02, -3.6585e-01, -1.4559e-01,
 9.1550e-02, -5.4007e-02,  6.7482e-02,
-1.8687e-01,  3.2120e-01,  5.1031e-03,
-6.1205e-02, -5.1780e-02,  1.6442e-02,
-1.2316e-02, -1.3907e-01, -1.4446e-01,
-2.7899e-01, -8.5969e-02, -1.0870e-01,
-2.6157e-01,  8.9532e-02,  3.0958e-02,
-1.5393e-01, -4.2781e-02, -2.0951e-01,
 2.0328e-01,  4.5317e-01, -3.0467e-02,
-6.1346e-02,  1.0381e-01, -1.3719e-01,
-9.8572e-02, -1.4035e-01, -1.9431e-02,
 2.5542e-02,  3.2609e-01,  1.7983e-03,
-1.0800e-01, -2.9022e-02,  6.2691e-03,
 2.8937e-02, -1.3483e-01, -4.1655e-02,
 2.0172e-01,  1.4283e-02,  9.6200e-02,
 1.9027e-02,  3.1240e-01, -2.9553e-02,
 6.2776e-02,  1.3845e-01,  4.5834e-02,
-2.3854e-01, -4.0267e-02,  1.5634e-02,
-1.9246e-01, -3.2332e-02,  3.2442e-03,
-6.1880e-02, -8.8192e-02, -6.0172e-02,
 2.5002e-01,  1.5148e-01,  6.4459e-02,
-2.1022e-01, -8.3893e-02,  6.9554e-03,
 7.0244e-02, -2.9551e-02,  1.6481e-02,
-3.1036e-02, -2.0026e-01, -8.4748e-02,
-1.3108e-01, -1.3784e-01,  9.4900e-02,
-2.1256e-01, -4.1767e-02,  8.4665e-02,
-4.0235e-01,  1.0604e-01, -3.1827e-02,
-4.9825e-02, -9.1267e-04,  1.5527e-02,
-6.5729e-03, -1.8932e-02, -3.4591e-02,
 1.1066e-01,  9.3979e-02,  2.6059e-02,
-1.2395e-01, -2.4768e-01, -1.6304e-01,
 8.8329e-03, -2.1606e-02, -4.0878e-02,
-1.5581e-02, -1.4829e-02, -1.5959e-02,
-1.0463e-04, -4.2903e-03, -4.6657e-02,
 2.2995e-02,  1.7917e-02, -9.1404e-02,
-1.2326e-01,  1.4582e-01, -7.0959e-02,
-1.8058e-02, -8.5228e-02,  4.2799e-02,
-2.2829e-03,  8.6577e-02, -1.1909e-01,
-1.8061e-01,  1.1166e-01, -8.2255e-02,
-1.3190e-01,  7.7123e-02,  2.3224e-02,
 1.8661e-02,  2.4461e-02,  3.6060e-02,
-4.5224e-02, -1.7672e-01,  1.6080e-01,
-4.2175e-01, -2.2557e-01, -1.0719e-01,
-2.9506e-02,  9.5020e-02, -6.6465e-02,
-7.2627e-02,  3.1236e-01,  5.5764e-02,
-2.8789e-01, -1.8915e-01,  9.0825e-02,
-5.8618e-02,  6.4082e-02,  4.8461e-03,
-5.9405e-02,  3.2644e-01, -7.1278e-02,
-1.8084e-01,  2.0858e-02, -9.3690e-03,
-7.6565e-03, -9.6854e-02,  7.6121e-03,
 1.4791e-01,  4.5612e-01,  1.9889e-02,
-5.5498e-02, -1.1266e-01,  2.2790e-02,
-3.8821e-02, -1.5780e-02,  1.2549e-02,
-3.8232e-02, -2.8870e-01,  2.6216e-02,
 1.0375e-01, -2.9621e-02,  1.8479e-03,
 5.0207e-02,  1.5189e-01,  1.2533e-01,
 1.8298e-01, -1.2870e-01,  3.0681e-01,
-1.9571e-02, -8.6302e-02,  9.1121e-02,
 1.0113e-01, -1.8362e-01,  3.2642e-02,
 1.7034e-01, -3.1077e-01, -4.8737e-02,
 5.9144e-02,  5.6052e-03,  3.2360e-02,
-9.0123e-02,  7.7996e-02,  3.6297e-02,
-3.4389e-01,  1.1841e-01, -2.0900e-02,
 9.4930e-02, -9.1504e-02, -4.5308e-02,
 3.7723e-03, -3.7580e-02, -6.6410e-02,
 5.2501e-02, -1.2530e-01,  3.5944e-02,
 3.8378e-02,  9.5188e-02,  2.1952e-03,
-2.4333e-02,  2.7977e-01,  5.6961e-02,
-3.0605e-03,  8.3684e-02,  4.4848e-03,
-7.8935e-02, -1.9544e-01, -5.3311e-02,
-2.6595e-02,  1.2278e-01, -3.1659e-02,
-1.0103e-02,  4.7763e-01,  2.5359e-02,
 8.1397e-02,  3.0548e-01,  9.7097e-02,
 3.6232e-02, -1.1091e-01,  1.2841e-01,
 1.9277e-01,  2.9322e-01, -1.6740e-01,
 1.2107e-01, -6.2883e-02,  4.0603e-02,
-1.5750e-01, -8.6183e-02, -1.4194e-01,
 1.1932e-01, -3.9175e-01, -5.4495e-02,
-1.4001e-02, -2.0594e-01, -8.2683e-02,
 8.6156e-02,  2.1499e-02,  2.2080e-01,
 5.5703e-02, -3.6307e-01,  8.3129e-02,
 8.9280e-02, -3.5897e-02,  1.6106e-01,
 9.1171e-02, -3.1102e-01,  1.2425e-01,
 1.0278e-01, -3.1014e-01, -6.9138e-02,
 8.0839e-02, -3.6183e-02,  1.0341e-01,
-1.8334e-01, -5.3700e-02,  2.3336e-01,
-1.4464e-01, -5.0320e-01, -2.9836e-02,
-1.7225e-01, -3.9499e-01, -1.7321e-01,
 1.7510e-01,  1.7897e-01, -2.6518e-01,
 2.3638e-01,  5.0270e-01, -4.9731e-03,
 2.2603e-01,  2.5317e-01,  2.4079e-01,
-1.3159e-01,  1.5638e-01,  1.2480e-01,
-6.2164e-02,  7.9458e-02, -9.4804e-02,
 8.5690e-03,  7.4971e-03,  8.6630e-02,
-1.3148e-02,  6.8660e-02, -7.4230e-03,
 2.9702e-02,  1.2036e-01,  9.5504e-02,
-3.2694e-03,  8.6722e-02, -6.2433e-02,
 3.2527e-01,  3.2087e-01, -9.4429e-05,
 1.3556e-01, -7.0413e-02,  2.9383e-02,
 2.0617e-02,  3.3218e-02,  4.4898e-02,
-4.8260e-01, -2.1329e-01,  1.5890e-02,
-2.6600e-01, -8.8519e-02, -4.3800e-02,
-1.7299e-01, -2.0757e-01, -2.6658e-01,
 6.9707e-02, -4.4700e-02,  6.5570e-02,
 2.3992e-01,  1.5078e-01,  2.8713e-02,
-9.1197e-02,  1.9765e-02, -1.8751e-02,
-9.9277e-02, -3.1437e-01,  4.0730e-02,
 2.4208e-02, -8.8322e-02, -1.6245e-01,
 1.3037e-02, -3.4708e-02, -4.4285e-02,
-1.3592e-01, -1.3575e-01, -7.4546e-02,
 1.4670e-01, -1.3366e-01,  2.1553e-03,
 8.1235e-03, -1.2068e-01, -5.7287e-02,
 1.8015e-01,  2.1390e-01,  8.6923e-03,
 2.8833e-01,  6.6345e-02,  1.4578e-01,
 2.2338e-01,  2.6453e-01, -2.9112e-02,
 1.4018e-01, -9.2824e-02, -2.2795e-02,
 1.2360e-01,  2.2527e-01, -1.1817e-01,
-3.8872e-02, -1.9982e-02, -7.7514e-02,
 1.7744e-03,  3.1736e-02,  4.5882e-02,
-2.5222e-02,  2.4298e-01, -3.8596e-02,
 1.2545e-02,  3.1872e-02,  7.1925e-02,
 7.9782e-02, -1.5533e-01, -1.4619e-02,
-1.2223e-01, -1.8631e-03, -9.8832e-02,
-1.6815e-02, -8.1440e-02,  6.8038e-02
}
,)"
R"(
{
 2.3898e-02,  1.2411e-02, -3.2770e-02,
-2.6029e-01,  3.2690e-01, -1.8246e-01,
 1.1224e-02,  8.0193e-02, -5.0412e-02,
-9.3849e-02,  2.0325e-02,  2.6309e-02,
 1.2266e-02,  1.7698e-01,  2.7049e-01,
 1.2918e-01,  2.0190e-01,  2.7352e-01,
-7.2100e-02,  1.3357e-01, -1.3702e-01,
 2.2527e-01,  1.5821e-01, -2.3104e-01,
 1.0182e-02, -1.5499e-01,  7.1906e-02,
 1.5865e-01,  7.0950e-02, -6.3336e-02,
 2.2661e-01, -4.2997e-01, -4.2013e-01,
 1.7549e-02, -1.3142e-01, -3.1663e-01,
 1.3617e-01,  1.4229e-01, -1.0707e-02,
-1.0986e-02,  2.8816e-01, -3.6239e-01,
 2.2579e-02, -1.4332e-02,  7.1339e-03,
-1.4357e-01, -9.7608e-02,  1.4646e-01,
-5.3856e-02,  3.3898e-01, -2.4936e-01,
-2.9500e-02,  2.1799e-02,  1.1901e-02,
 3.6996e-02,  2.1291e-02,  3.2150e-02,
 9.8375e-02,  2.4476e-01,  2.2896e-01,
 1.8392e-01, -7.4510e-02, -1.0152e-01,
 4.4757e-02, -4.8053e-03, -6.7254e-02,
-4.8370e-02, -7.8975e-02, -3.6007e-01,
-3.8160e-02,  8.7707e-02, -1.4986e-01,
-8.7544e-03, -4.3522e-02,  7.3822e-02,
-1.4523e-01,  1.1433e-01,  4.4109e-02,
-1.6025e-03,  2.5459e-02, -9.3562e-02,
-2.9192e-02, -1.0975e-01, -5.0943e-02,
-1.1215e-01,  1.9907e-01,  7.9934e-02,
 3.7066e-02,  3.0796e-01, -1.4034e-01,
-8.2315e-02, -2.0182e-02, -1.2824e-02,
-4.8007e-03,  1.2655e-01, -2.5157e-02,
 2.7796e-02, -4.3032e-02,  2.5397e-02,
 6.9377e-02,  2.3642e-01,  1.2713e-01,
 2.7878e-02, -1.5325e-01, -1.4871e-01,
 1.5800e-02, -4.5935e-02,  1.7370e-01,
 4.8058e-02, -1.8725e-01, -6.7048e-03,
-1.3932e-01, -6.0768e-02, -1.6976e-01,
-2.1189e-02,  1.0311e-02, -2.2970e-02,
-7.0546e-03,  7.9481e-02,  1.2146e-02,
 4.2666e-02,  3.5383e-01,  1.4381e-01,
 5.4384e-02, -9.3862e-02,  4.8870e-03,
 2.1141e-02, -6.6826e-02, -1.8526e-01,
 1.3309e-01,  3.3452e-01,  1.1058e-02,
-1.6967e-02,  1.1094e-01,  5.3230e-02,
 3.0409e-02, -4.7613e-02, -1.7737e-01,
-1.6678e-02, -7.8644e-02,  1.1743e-01,
 7.3322e-02, -1.1354e-01, -1.5737e-02,
-1.2397e-03, -1.4685e-02, -1.0192e-02,
 1.6045e-01,  3.6331e-02,  1.2219e-01,
 1.3123e-01,  5.7578e-02,  1.0291e-01,
 1.7424e-01,  1.0688e-01,  1.4263e-01,
 8.9942e-02, -2.7141e-02,  3.1238e-02,
-4.0240e-02, -1.0930e-01, -2.1276e-01,
 1.0357e-01,  5.7673e-02,  1.0356e-02,
-2.0864e-01, -1.9405e-01,  2.5094e-01,
-4.8277e-03, -1.3758e-01,  1.1562e-01,
-1.0358e-01,  2.0631e-01, -9.1445e-03,
-1.7602e-01,  1.0200e-01,  3.0032e-02,
-1.1495e-02, -4.5077e-02, -6.4748e-02,
-2.3072e-02, -3.2342e-02,  1.4503e-02,
-3.7052e-02, -1.2206e-01,  5.5395e-02,
 2.8331e-02, -4.2812e-03,  6.9807e-02,
 4.3593e-02, -6.7373e-03,  1.2760e-02,
 3.2896e-03, -2.4007e-01, -5.2920e-02,
 2.5193e-02, -2.1480e-01,  8.4654e-02,
 2.2642e-02,  8.2132e-02, -2.3864e-02,
-2.9726e-01,  8.0405e-02, -1.3190e-02,
-1.1310e-01, -4.4342e-01, -6.3536e-02,
-6.7090e-02,  1.1797e-01,  1.5315e-01,
 7.7829e-02, -1.4494e-01,  1.0233e-01,
 9.7059e-02,  1.2772e-01, -2.4394e-02,
-2.6179e-02,  2.6721e-02,  1.1707e-02,
-4.8024e-02, -2.3366e-01, -1.6978e-01,
-2.4402e-01, -2.8572e-01, -2.4053e-02,
-2.7451e-03,  7.1959e-02,  4.4706e-02,
-1.9900e-01,  2.1353e-01,  1.0625e-01,
 4.0246e-01,  4.2323e-01,  3.4046e-02,
-1.6943e-01, -2.0221e-01, -1.6369e-01,
 1.3882e-01,  2.1717e-01, -1.3581e-01,
 1.3975e-01,  1.1980e-01,  1.8888e-02,
-1.8110e-01, -2.6143e-01, -1.0109e-01,
 5.5844e-02, -1.2175e-01,  3.4447e-02,
 8.9688e-02,  2.4641e-01,  2.3287e-01,
-5.8259e-02, -1.3656e-01, -1.3936e-02,
-8.3429e-03,  2.3026e-01,  1.2302e-01,
-2.2969e-02,  6.0932e-02,  3.4749e-02,
 1.2910e-01,  2.4008e-01,  1.8908e-01,
-5.8776e-02,  3.8121e-01,  8.1312e-02,
 9.1175e-02, -1.8729e-02, -4.6156e-02,
 3.7493e-02, -3.5877e-02, -9.9651e-03,
 1.5864e-01,  1.3611e-01,  6.7880e-02,
 2.2216e-01,  9.3697e-02,  7.4782e-02,
-1.0861e-01, -2.5824e-01,  6.6455e-02,
 9.2238e-02, -2.3448e-01, -3.4057e-01,
-2.9658e-01,  9.4698e-03,  1.9315e-01,
-5.2396e-02,  1.2310e-01, -5.2917e-02,
-4.3708e-03,  1.9560e-01, -2.4309e-02,
-6.7388e-02, -8.8839e-02, -2.0907e-02,
 4.6550e-02,  3.4119e-02,  6.0977e-02,
-1.0054e-02,  1.4411e-01,  1.5622e-01,
 1.7401e-02,  2.5685e-01, -9.1853e-03,
-4.4530e-02, -1.8623e-01, -8.4557e-02,
 9.5962e-02,  2.6491e-01,  1.7854e-01,
-2.0547e-02, -1.2023e-01, -7.6897e-02,
-1.3418e-01, -1.4960e-01,  1.6292e-01,
-1.7275e-01, -6.0181e-02, -2.7034e-02,
-7.4189e-02, -3.5566e-02,  1.3995e-01,
 3.0758e-02,  3.3476e-02,  6.9837e-03,
-6.1089e-02, -9.6021e-02,  7.1716e-03,
 1.0389e-01,  4.7963e-02,  9.5921e-02,
 4.4569e-02,  1.2230e-01, -1.4417e-01,
-1.2825e-02,  3.1980e-01, -3.5905e-01,
-1.2557e-01, -7.5283e-02, -1.2343e-01,
 1.9791e-01,  7.9003e-02,  3.1163e-02,
 1.0969e-01,  1.6839e-01, -2.5816e-01,
-1.2617e-01,  1.3686e-01, -2.1078e-01,
-2.1870e-02, -1.8378e-01, -2.8893e-01,
-8.2523e-02, -3.0475e-02,  9.6007e-02,
 1.0669e-01, -1.4581e-03,  3.2441e-01,
-8.1872e-03,  1.1690e-02, -4.0179e-02,
-1.0835e-01,  3.6112e-01, -4.5990e-02,
-1.2355e-01, -1.3372e-01,  3.8136e-02,
-9.1530e-03,  3.5432e-02,  4.3950e-02,
-8.6859e-02,  1.5887e-01,  1.2796e-02,
 1.3554e-02, -1.5669e-01, -1.4371e-02,
-4.6609e-02,  1.7114e-01, -7.8284e-02,
 1.7611e-01,  4.1204e-01,  9.3281e-02,
 1.1420e-01,  1.2951e-01, -7.6025e-02,
-5.4831e-02,  9.7574e-02,  3.2839e-02,
 3.8475e-02, -6.0247e-02, -2.9627e-02,
-2.4367e-02,  1.3143e-02,  4.7017e-02,
 2.3800e-02, -2.4046e-02, -5.7044e-02,
 2.7280e-02,  7.8573e-01,  1.0079e-02,
 6.4100e-02,  5.1584e-02,  7.9653e-03,
-8.9480e-02, -1.6207e-01, -8.9418e-02,
-3.5589e-02,  3.5903e-01, -1.8381e-01,
 9.2356e-02,  8.8046e-02, -5.0229e-02,
 1.8609e-02,  1.1243e-01,  5.2599e-02,
-1.3374e-02, -3.3097e-01,  6.5346e-02,
 2.6760e-01, -1.0281e-01,  1.1607e-02,
 7.6576e-03, -3.5957e-02,  3.1924e-02,
-7.0088e-02,  9.1241e-02,  1.2827e-02,
 3.7165e-02,  7.0273e-03, -7.3945e-04,
-6.5406e-03,  7.2666e-02, -5.7348e-02,
-1.9100e-01, -7.4449e-02, -1.2496e-01,
 1.5299e-01, -8.8047e-02, -2.1810e-02,
-3.0241e-02, -7.4310e-03, -8.7682e-02,
-2.2479e-02,  9.6008e-02, -8.4539e-02,
-2.8915e-02,  1.7538e-01, -3.7735e-02,
-9.8463e-03, -6.9618e-02, -2.6095e-01,
 9.9950e-02,  5.0534e-01, -1.8812e-01,
-1.1986e-01,  7.1166e-02, -2.4769e-02,
 8.8529e-02,  9.8348e-02,  2.1136e-02,
-9.0337e-03,  1.3679e-01, -1.2115e-01,
-6.2478e-03,  1.1436e-01, -3.4610e-02,
-2.7350e-02,  1.0702e-01,  1.6220e-02,
 1.0912e-02,  1.0953e-01,  8.6762e-02,
 2.9348e-03, -2.2035e-02,  1.2376e-01,
 7.0102e-02, -1.0945e-01, -1.6640e-01,
-3.9916e-03, -2.6658e-02, -9.7031e-02,
-3.0047e-02,  1.6631e-03, -5.5031e-02,
-7.9624e-02,  1.9976e-01,  1.9582e-01,
 2.1377e-01,  3.5835e-01,  1.7012e-01,
-9.7751e-02,  4.9143e-01,  1.0988e-01,
 8.4055e-02, -7.3187e-03, -9.8808e-02,
 5.0590e-02, -8.9291e-02, -6.6857e-02,
 9.6737e-02, -3.0699e-01,  2.2889e-01,
 2.6727e-40, -5.2704e-40, -4.5038e-40,
-3.3108e-40,  5.2330e-40, -1.2724e-40,
-3.2957e-40, -5.8613e-40,  2.1618e-40,
-4.3882e-40, -3.3950e-40,  5.9372e-40,
 2.7277e-40, -1.3741e-40, -3.3597e-40,
 5.0687e-40,  4.7873e-40, -3.2116e-40,
-6.1388e-40, -6.0790e-40, -5.2667e-40,
-5.6524e-40, -6.1696e-40, -5.9796e-40,
 1.5824e-40, -5.2002e-40, -5.8960e-40,
-5.9860e-40,  3.6419e-40,  2.9975e-40,
-5.8988e-40,  3.3994e-40, -5.0611e-40,
 3.6410e-40,  2.9550e-40,  4.7468e-40,
 2.7503e-40, -3.4103e-40,  6.0339e-40,
-1.7691e-40,  6.7170e-41,  1.7101e-40,
 2.7166e-40,  4.3023e-40,  2.7735e-40,
-3.1937e-40, -4.9247e-40, -6.2495e-40,
 5.2938e-40, -3.3702e-40,  1.4976e-41,
 1.4031e-40, -4.6995e-40, -5.2409e-40,
 2.5460e-40,  2.6670e-40, -4.5339e-40,
 4.2896e-40, -5.7141e-40, -1.7003e-40,
 2.3597e-40,  1.3748e-40,  4.6163e-40,
 4.0680e-41, -6.1642e-40,  2.7304e-41,
 5.2250e-40, -3.9481e-40, -6.1808e-40,
 1.9462e-40,  2.6005e-40, -2.7281e-40
}
,)"
R"(
{
 1.3625e-02, -8.5594e-02, -1.9901e-01,
-6.4636e-02, -1.9030e-02,  4.1963e-02,
-7.5507e-02, -2.4474e-01, -4.2621e-02,
 2.8195e-02,  7.3102e-02, -9.3331e-02,
 7.7093e-02,  1.7800e-01, -7.6451e-02,
 2.8565e-02, -1.3540e-01, -1.9169e-01,
-1.8583e-02,  3.0135e-02,  8.1094e-03,
-1.2835e-01, -1.8041e-01, -8.9020e-02,
-8.2731e-02,  3.7861e-02, -9.4014e-02,
 4.6595e-02,  2.2052e-02, -1.5867e-01,
-1.0937e-02,  1.0030e-01, -1.3018e-01,
-9.1844e-02, -1.7508e-01,  2.2087e-01,
-9.3080e-02,  9.8069e-02, -7.0154e-02,
-6.6063e-02, -2.2142e-01,  4.1058e-01,
-6.5947e-02, -5.4662e-02,  9.9412e-02,
-5.1938e-02,  3.0932e-03,  1.8126e-01,
 3.6701e-02, -3.0349e-01,  9.9839e-02,
 2.5810e-02,  2.3644e-01, -2.4461e-01,
 2.1054e-01,  1.5630e-01, -1.9587e-01,
 5.0146e-02, -1.8844e-02,  3.6675e-01,
-4.0389e-03,  3.1596e-01,  3.6771e-03,
-2.2256e-40,  1.4272e-40, -2.0732e-40,
 5.5913e-40, -6.0538e-40,  1.2791e-40,
 4.5825e-41,  4.1080e-41, -1.8211e-40,
 2.2687e-01, -5.8992e-02,  4.7796e-03,
 6.0603e-01,  2.7961e-01,  1.5973e-02,
 2.3035e-01,  1.3031e-01, -9.9280e-03,
-4.7235e-02,  5.1773e-02, -4.8586e-02,
-1.4510e-01, -1.7336e-01,  1.0981e-01,
-2.0303e-01, -1.6008e-02, -1.8524e-03,
-2.3440e-01, -3.2373e-02, -6.7911e-02,
-1.6256e-01,  1.2316e-01,  2.7859e-02,
 8.5089e-04, -3.7401e-02, -1.8672e-02,
-1.0418e-01, -7.8407e-02, -1.8413e-02,
 8.2834e-02,  2.3128e-01,  3.2983e-02,
 3.1099e-02, -6.4485e-02, -8.1659e-02,
 1.9152e-01, -1.9609e-02,  2.7364e-02,
 1.0458e-02, -1.2507e-01,  4.1334e-02,
-4.6215e-02,  5.6944e-02,  2.1477e-02,
-1.4934e-01, -6.8383e-02,  2.7957e-02,
-3.6846e-01,  4.8766e-01,  6.4000e-02,
-3.9621e-02, -8.1667e-03,  4.5997e-02,
-6.1391e-02,  1.2976e-02, -3.2152e-02,
 7.5767e-02,  1.2931e-01, -2.3498e-02,
 4.0320e-02,  1.3876e-02,  1.1022e-02,
-6.2401e-41,  5.8564e-40,  3.9473e-40,
-5.6890e-40, -2.6022e-40, -2.9841e-40,
-4.2456e-40, -1.1546e-40,  4.4955e-40,
-4.2969e-02, -1.0995e-01,  1.3021e-01,
 1.0142e-01,  5.2225e-01, -5.5486e-02,
-7.2349e-02,  8.5470e-02,  2.3438e-02,
-1.0690e-01, -1.4370e-01, -1.2632e-01,
 2.8754e-02,  1.1662e-01,  5.6515e-02,
-1.5726e-01, -1.4945e-01, -4.4956e-02,
 1.6574e-01, -5.6894e-02, -2.0851e-01,
 8.1498e-03, -2.5441e-01, -1.4412e-01,
-1.0959e-02, -2.5811e-02,  8.8934e-02,
 6.3594e-02, -9.3314e-02,  7.8247e-02,
 4.6795e-02, -2.2774e-01,  7.1041e-02,
 1.4830e-01,  1.9911e-01,  5.1978e-02,
 7.4936e-02,  2.3104e-02,  6.3928e-02,
-1.3118e-02,  6.7544e-02,  7.9514e-02,
 2.2335e-02, -9.9442e-02,  6.8070e-03,
 2.4395e-02, -3.3576e-02,  5.5508e-02,
-4.0872e-02,  5.4501e-02, -5.7051e-02,
 8.6621e-03, -1.5361e-01,  1.2630e-01,
-2.2344e-01,  1.3335e-01, -1.1688e-01,
-2.4232e-01,  3.3319e-01, -1.2580e-01,
-2.2169e-02,  2.0594e-01,  2.6521e-02,
 4.1883e-40, -3.4540e-40,  4.9152e-40,
-1.5711e-40,  3.3927e-40, -5.5069e-40,
 5.5831e-40, -5.2011e-41,  1.0351e-40,
 1.7989e-01,  2.3787e-02,  5.7447e-03,
 4.8748e-01,  3.0152e-01,  3.5517e-02,
 2.2155e-01,  1.8812e-01,  3.0994e-02,
 7.8657e-02, -7.1135e-02, -5.8293e-02,
-1.4220e-01,  1.6004e-02, -2.5180e-02,
-1.6811e-01, -2.3441e-01,  1.4810e-02,
 5.3140e-02, -1.2904e-01, -1.5105e-02,
 5.4525e-02, -1.5418e-01,  6.6507e-02,
 8.3947e-02, -1.1975e-01,  5.3902e-02,
 8.0834e-02, -2.4321e-01, -1.0282e-03,
 3.1276e-03,  3.2495e-01, -1.3238e-02,
 4.5285e-02,  5.8777e-02, -1.3231e-01,
-6.0928e-03,  8.7145e-02,  6.2031e-02,
-5.3919e-01, -6.8810e-02, -1.0755e-01,
-2.2571e-02,  2.6237e-02, -6.8731e-03,
-6.6771e-02, -2.0586e-01,  4.7722e-02,
-3.4968e-01,  3.0912e-01,  2.4487e-01,
-4.9537e-02, -5.2779e-04,  6.7840e-02,
 1.7583e-02,  3.3222e-02, -5.7070e-02,
-2.3250e-01,  1.4470e-01, -4.9895e-02,
 3.3147e-02,  8.6319e-02,  4.4719e-02,
-6.9454e-41,  2.0308e-40, -1.1977e-40,
 5.9045e-40, -2.6129e-40,  4.8298e-40,
 4.7288e-40,  6.0736e-40,  2.2462e-40,
-4.0294e-02, -9.1437e-03, -2.4926e-02,
-2.1269e-01,  1.1602e-01,  1.4383e-02,
 5.1456e-02,  6.9047e-02,  1.6519e-02,
 6.3737e-02, -9.0181e-02,  7.0716e-02,
 7.0061e-02,  7.9046e-02, -4.3925e-02,
 7.4396e-02, -5.2797e-02,  3.8125e-02,
 7.5999e-02, -5.1307e-02,  2.4326e-03,
-3.1716e-02, -1.2567e-01, -3.3898e-02,
 8.4925e-02, -5.2404e-02,  2.8535e-02,
 9.6844e-03,  4.6980e-02,  3.8552e-02,
-5.7110e-02,  3.2163e-02,  1.5219e-02,
 6.6905e-02, -2.7934e-02,  1.4184e-03,
-2.4239e-02, -8.6317e-03, -2.3295e-03,
-2.3065e-02,  1.0076e-01,  2.1562e-03,
-1.3647e-02, -3.4262e-02,  2.5777e-02,
 7.6601e-02,  1.3654e-01,  2.1458e-03,
 1.4542e-01,  3.6310e-01,  1.6266e-01,
-5.8465e-02,  4.3751e-02,  1.9227e-02,
 9.1783e-03, -5.9547e-02, -1.8234e-02,
-5.3399e-02,  1.9218e-01, -4.6238e-02,
-1.9052e-01,  1.4635e-02,  2.9536e-02,
 1.4621e-40, -5.5132e-40, -4.6215e-40,
 4.3948e-40, -2.7285e-40, -5.5709e-40,
 1.9428e-41, -4.0333e-40, -5.4469e-40,
 9.3126e-02, -1.3236e-01,  9.9350e-02,
-1.3308e-01,  3.5030e-01,  9.2221e-02,
 1.1783e-01,  1.6648e-01, -7.9150e-02,
 2.2654e-01, -1.2546e-01, -1.2354e-01,
-1.6457e-01, -6.0740e-02, -3.1069e-02,
-8.3203e-02, -1.8064e-01,  4.6900e-02,
 1.2059e-01, -1.0569e-01, -7.1196e-02,
-9.2991e-02, -1.7587e-01,  1.3100e-03,
-1.5492e-01, -1.3849e-01,  1.2245e-01,
-5.5276e-02, -9.7867e-02,  3.5550e-02,
-6.0264e-02,  4.7760e-02,  6.0242e-02,
-5.4096e-03,  2.4646e-01,  6.3592e-01,
 5.8559e-02,  6.1117e-02,  8.0334e-02,
-4.4582e-03, -1.2028e-01,  8.7394e-02,
-2.5880e-02, -1.2206e-01,  1.2199e-01,
 4.1990e-02, -1.3283e-01,  4.9047e-02,
-4.9532e-02,  2.7688e-01, -4.6064e-03,
-2.8812e-03, -2.4404e-01,  5.8614e-02,
-1.4262e-01, -1.2810e-03, -1.2060e-01,
-8.3595e-02,  5.6532e-02, -7.7556e-02,
-1.3364e-01, -1.3883e-01, -1.2335e-01,
-1.3273e-40,  6.5184e-41, -4.6946e-40,
-4.0031e-40, -1.2807e-40, -3.1584e-40,
 1.3009e-40,  2.4187e-40, -1.4202e-40,
-8.8844e-03,  1.0101e-03, -6.0190e-02,
-1.8851e-01, -7.6662e-02, -1.4562e-01,
 2.9983e-02, -8.1533e-02,  1.1256e-02,
 1.0205e-01,  6.7850e-02, -1.0911e-01,
-1.2846e-01, -5.4605e-02,  6.2182e-02,
-1.0797e-01, -5.1281e-02, -1.2036e-02,
-8.1693e-02, -7.0432e-02,  1.6990e-01,
-1.7329e-01, -2.2084e-01, -3.0977e-02,
 8.2771e-02, -3.3089e-01, -1.4842e-01,
 1.9576e-02, -1.5953e-01, -1.0348e-01,
 6.6014e-02,  6.0094e-01, -6.9891e-04,
 7.4969e-02, -1.4250e-01,  4.3221e-02,
 1.6796e-02, -6.8125e-03,  4.7028e-02,
-3.3421e-01, -2.2987e-01,  4.2936e-02,
 9.3985e-04,  9.0827e-02,  2.4211e-01,
-8.1571e-02, -1.0276e-01,  1.9092e-01,
 2.1112e-01,  2.6837e-02, -2.5822e-01,
-1.3290e-01,  1.6135e-01, -2.7672e-02,
 3.4465e-01, -8.3286e-03, -6.1936e-02,
 2.7406e-01, -6.8357e-02,  1.7426e-01,
-9.0872e-02,  1.2999e-01,  7.2366e-02,
 3.0944e-40, -1.2808e-40,  2.9336e-40,
 5.5561e-42,  3.0978e-40,  1.0027e-40,
-1.5881e-40, -2.9858e-40,  3.1599e-41,
-9.1935e-02, -2.2666e-04, -6.2821e-02,
-1.8605e-01,  3.0238e-01,  3.2759e-02,
-5.0771e-02,  1.4585e-02, -1.0872e-01,
 2.5511e-02, -9.3394e-02,  1.4810e-02,
-6.2906e-02,  9.2472e-02,  1.2845e-02,
-2.9041e-01, -9.6489e-03, -2.7277e-02,
-6.9896e-02, -1.1645e-01, -5.9870e-02,
-2.8037e-02, -2.2649e-01,  5.1781e-02,
-1.4588e-02,  4.8753e-02, -2.8256e-02,
-1.6462e-02,  8.0795e-02,  3.6222e-02,
 8.0392e-02,  3.0118e-01,  2.0021e-01,
 1.0394e-01,  6.4196e-01,  4.9545e-01,
 2.1242e-02, -1.2514e-01,  1.0066e-01,
-4.7676e-02, -2.0736e-02, -5.6951e-03,
-8.3021e-02,  4.6763e-02,  1.7551e-01,
 2.0038e-02,  1.8084e-01,  1.3244e-02,
 1.0280e-02,  2.8740e-01,  8.9837e-03,
-2.9437e-02, -3.7366e-01, -1.1861e-01,
-4.8248e-03, -1.2970e-01, -1.8680e-02,
 1.8458e-01,  5.6509e-02,  1.2734e-01,
 1.9423e-01, -3.6960e-01, -2.5555e-02,
 6.7959e-41, -3.2251e-40, -3.0631e-40,
-4.0701e-40,  9.7399e-41,  2.2917e-40,
 2.0169e-40,  5.7891e-40, -4.1286e-40
}
,)"
R"(
{
 5.6253e-02,  1.0118e-02, -8.2749e-02,
-6.4074e-02,  4.0723e-02,  1.1657e-02,
-1.1560e-01, -3.5596e-03, -2.6713e-02,
-7.9090e-02, -2.9223e-01,  1.5759e-01,
 6.8756e-02,  1.5738e-01,  1.5413e-01,
-6.1288e-02, -1.2536e-01, -1.5966e-01,
 1.1165e-01,  5.0211e-02, -1.0338e-01,
-5.2364e-04,  1.7660e-01, -2.2504e-03,
-1.7697e-01,  1.8500e-02,  2.0693e-02,
-2.5907e-02, -1.4201e-01,  8.4467e-02,
 1.1138e-02,  2.1769e-01, -4.2422e-01,
 6.5046e-02,  2.6834e-02,  2.9047e-03,
-1.2130e-01, -5.1773e-01, -8.0393e-02,
 3.0204e-02,  3.5952e-01,  1.6681e-01,
-9.4720e-04,  7.7291e-02,  8.3039e-02,
 3.4689e-01, -1.2389e-01, -2.0666e-01,
-2.9650e-02,  1.1102e-01, -1.4782e-01,
 3.2193e-02, -3.9862e-02,  1.6440e-02,
-8.4264e-02,  1.0192e-01, -6.4256e-02,
 2.2950e-02, -6.6511e-02, -6.3814e-02,
 4.3744e-02, -1.0557e-01, -1.2045e-02,
 1.6330e-01,  6.6130e-01,  1.5497e-01,
 1.7103e-01,  1.5073e-01,  1.7400e-01,
 9.0985e-04,  1.0917e-02, -1.3322e-02,
-6.4273e-02, -6.2178e-02, -7.7223e-02,
-1.0332e-01, -2.1072e-01, -2.2843e-03,
 3.2717e-02, -6.3754e-02,  5.0359e-02,
-5.2566e-02,  6.2090e-02, -1.5614e-02,
 1.4570e-02, -1.0243e-01,  1.3091e-01,
-2.9988e-02, -7.5897e-02, -9.4541e-04,
-2.7999e-01, -4.7415e-03,  5.6419e-02,
 7.0565e-02, -4.9273e-01, -1.2936e-01,
 5.5685e-02, -5.8924e-03, -3.1967e-02,
 8.8602e-02,  2.9337e-01,  1.3753e-01,
 1.0063e-02,  1.6348e-02,  1.0063e-01,
 3.6230e-02,  1.7968e-02, -1.1624e-01,
-2.2488e-02,  1.3474e-01, -1.1419e-01,
 2.8576e-02, -7.4794e-02, -7.7261e-02,
 5.8874e-02, -2.9448e-03,  6.0207e-02,
 1.4642e-01,  1.2321e-01, -2.4936e-01,
 2.2609e-02, -2.8171e-01,  1.1510e-01,
 2.6056e-02, -2.7532e-02, -4.7505e-02,
-2.8762e-02, -1.2610e-02, -8.3766e-02,
-5.0992e-02, -5.7269e-03, -7.0981e-02,
-9.6191e-02, -9.2384e-02, -5.3328e-02,
 2.3989e-01,  3.9819e-01,  1.8451e-01,
 3.6888e-02,  1.1023e-01,  4.4804e-03,
-4.4140e-03, -4.8275e-03,  2.0018e-02,
-2.4346e-02, -6.5546e-02, -4.6065e-03,
 2.2298e-01,  2.8810e-01,  1.4071e-02,
-1.7315e-01, -5.7961e-02, -9.9136e-02,
 3.6456e-02, -1.5518e-02,  6.4490e-02,
 4.6983e-02,  5.2743e-02,  3.0802e-01,
 6.7940e-02,  5.8777e-03,  3.1155e-01,
 9.9510e-02,  2.7974e-02, -6.6716e-02,
 3.7042e-01,  2.0813e-01, -3.1581e-02,
 7.9064e-02, -1.3699e-01, -4.4722e-02,
-8.4753e-03,  8.0676e-02,  1.5771e-01,
-1.1467e-01,  5.6269e-02,  1.1369e-01,
-1.4727e-02,  3.7263e-02, -2.0554e-01,
 8.3383e-02,  4.5848e-02, -1.1732e-02,
 4.5494e-02, -2.1406e-01,  6.0591e-02,
 4.6503e-02, -1.0362e-01,  3.8794e-02,
-4.6633e-01,  1.4504e-01,  1.4999e-01,
 2.9642e-01, -4.8807e-01, -1.6012e-01,
 1.6708e-01,  9.5313e-02, -7.5981e-02,
-4.2655e-02,  9.2470e-02, -7.7242e-02,
-2.1021e-01,  1.2423e-01,  1.4967e-02,
-5.4129e-02,  7.4355e-02, -4.7068e-02,
-1.6048e-01,  9.8742e-02,  4.4282e-02,
-6.0187e-02,  1.9495e-01,  8.3291e-02,
-7.5190e-02, -6.8429e-02,  3.7391e-02,
 5.1413e-04,  1.5098e-01, -1.1549e-01,
 1.6875e-01,  1.8040e-01, -1.3162e-01,
 7.7101e-02,  2.0816e-01,  7.6289e-02,
-1.7528e-02,  1.4408e-02,  3.7500e-02,
 3.8647e-02,  1.6850e-01,  1.7535e-02,
-2.8205e-02,  1.0273e-02,  1.6688e-01,
 4.3676e-02,  6.9895e-02,  8.1063e-03,
-2.6117e-01, -1.0920e-01,  5.2209e-02,
-5.2749e-02, -1.7062e-02, -9.6808e-02,
 2.7324e-02,  9.1342e-02, -5.0968e-02,
 1.0689e-01,  5.0565e-01,  4.6004e-01,
-6.6862e-03,  3.4162e-03,  3.3559e-01,
 3.5084e-02,  1.9123e-02,  1.0073e-02,
 1.6995e-01,  3.4099e-01, -4.0847e-01,
-5.5317e-03,  4.0230e-02, -2.0305e-01,
-8.9786e-02,  1.9667e-01,  3.8111e-02,
 3.0607e-02, -1.9084e-02, -6.5114e-02,
 8.5394e-02, -1.3992e-01,  1.4988e-02,
-1.5926e-02, -9.1200e-03, -7.2328e-02,
 1.3548e-01,  7.1040e-01, -9.4208e-02,
 2.5411e-03, -7.2159e-02,  1.0848e-01,
-8.9029e-02, -8.6339e-02, -2.7546e-02,
 6.0378e-02,  2.8401e-01, -6.6550e-02,
-3.0486e-02,  5.0307e-02, -1.1084e-02,
 2.9732e-02,  9.9960e-02, -7.7408e-02,
 3.4940e-01, -5.6048e-01,  2.9053e-02,
-2.6991e-02,  4.9637e-02, -3.9322e-02,
-1.0418e-02,  1.0931e-01, -6.1609e-02,
 3.6057e-02,  9.3866e-02, -1.0339e-01,
-1.8572e-02, -2.0889e-02, -7.4531e-02,
-7.3236e-02, -4.5908e-02,  2.2705e-02,
-1.5148e-02,  2.1735e-01,  2.2477e-02,
-3.4153e-02, -2.6939e-02, -5.0167e-03,
 6.6774e-02,  2.0168e-01, -7.5083e-02,
 5.6608e-02,  2.2799e-01, -3.7473e-01,
-7.2336e-02,  4.4329e-02, -3.6747e-02,
 3.5355e-02,  1.8671e-01, -4.0167e-02,
 1.2871e-01,  3.5050e-01,  1.8090e-01,
-6.2429e-02,  6.2184e-02,  6.8804e-02,
-8.0164e-02, -2.4387e-02, -5.0309e-03,
 1.0089e-01, -3.0008e-02,  1.7251e-02,
-9.4662e-03, -1.4760e-02,  7.3434e-03,
 7.3290e-02,  2.2546e-02, -2.9015e-02,
 7.9944e-02, -2.6972e-01,  7.1349e-02,
-1.7026e-02,  1.1461e-01, -4.1288e-02,
-5.3732e-02, -2.4618e-01, -1.2890e-02,
 8.6133e-02,  1.9503e-01,  8.2202e-02,
-1.0060e-03, -4.5931e-04, -1.8789e-02,
-4.0843e-02, -7.8149e-03, -6.1464e-02,
-7.9364e-02, -5.9647e-02, -5.4059e-03,
 1.9553e-01, -2.4079e-01, -7.9538e-03,
 5.3620e-02,  1.4198e-01,  6.5651e-03,
 2.3512e-02, -2.6609e-02, -4.6435e-02,
 1.2499e-02,  5.1079e-02, -2.2713e-02,
-7.1554e-02,  1.0608e-01,  5.8972e-02,
 1.8638e-01, -2.1053e-01, -6.4009e-02,
 1.0851e-01,  7.2187e-02,  8.9722e-02,
-4.5365e-04,  1.0826e-01, -6.4141e-02,
-2.3874e-02, -4.6307e-02, -2.7813e-02,
 1.8385e-02,  9.4687e-02,  6.8374e-02,
 9.4526e-02,  1.4432e-02,  1.5937e-01,
 1.1292e-01, -3.4274e-01, -1.0813e-01,
-7.4636e-03,  3.7101e-02,  3.7226e-02,
 3.7079e-02, -3.9169e-02, -3.7752e-02,
-7.9021e-02,  8.5978e-02,  1.0958e-02,
-5.8576e-02,  5.5931e-02,  4.8301e-02,
-1.3402e-01, -3.3809e-01, -4.4369e-02,
 1.4262e-01,  6.5254e-02, -3.3366e-01,
 1.2416e-02, -9.0492e-02, -5.8205e-02,
-1.4886e-01,  4.0598e-02, -1.4219e-01,
 2.0223e-03, -2.8673e-01, -3.3622e-01,
 1.9191e-02, -2.2104e-02,  1.9048e-02,
 6.0021e-02,  2.2520e-01, -5.3972e-02,
 1.6226e-01, -2.1918e-01, -5.2117e-02,
-6.2363e-03,  2.0266e-01, -7.3323e-03,
 1.1137e-01, -1.9300e-02, -5.4983e-02,
-1.8338e-01,  6.2511e-01, -1.7909e-01,
 1.7003e-01,  1.7902e-01,  5.4462e-02,
 5.6847e-02, -7.4696e-02, -1.1354e-02,
 1.0544e-01, -1.4918e-01,  4.8208e-02,
-5.6262e-02, -2.3303e-01, -2.9916e-02,
-3.3261e-02,  1.3287e-01,  1.9831e-02,
-1.3907e-01, -1.6180e-01, -7.2323e-03,
-5.1689e-02,  6.3121e-02, -1.4480e-01,
 1.1143e-01,  4.9625e-02, -5.4369e-02,
-3.9247e-01,  2.3412e-01, -3.6726e-02,
-1.1468e-02,  3.4045e-02,  6.6454e-02,
-5.0103e-02,  6.1740e-02,  4.2922e-03,
 1.7669e-01, -8.1250e-03,  6.3694e-03,
-6.7723e-02,  7.4576e-02,  1.0113e-02,
 1.1264e-01, -4.4691e-02, -5.3575e-02,
 3.4691e-02, -1.2201e-02, -8.4221e-02,
 2.3677e-01,  3.9073e-01,  2.4710e-02,
-8.4580e-02, -1.0747e-01, -6.5695e-02,
 1.5386e-01,  1.4041e-01,  6.9961e-03,
 2.6138e-02,  2.3149e-02, -1.8820e-02,
-3.3541e-02,  3.2089e-02, -1.8916e-02,
 1.0564e-01, -7.5319e-02, -5.4282e-02,
-6.9388e-03, -2.0873e-02,  5.6100e-02,
 2.3524e-02, -6.4296e-02,  5.8950e-02,
-3.1415e-03, -4.1203e-02,  1.0781e-01,
 1.7848e-02, -2.9535e-02, -1.6412e-02,
-4.6649e-02,  8.1277e-02, -5.9918e-02,
 8.1522e-02, -9.2037e-02,  8.1039e-03,
-6.5541e-02,  5.1811e-02, -1.4380e-03,
 5.0419e-02,  9.3091e-03, -2.8054e-02,
-3.0979e-02, -2.5366e-02,  3.5265e-02,
-3.7730e-02,  5.7574e-02,  3.4683e-02,
 4.8819e-03, -2.9519e-02,  3.7740e-02,
 6.4546e-02, -3.7272e-01, -8.5393e-02,
-3.0223e-02, -7.7899e-02,  2.7365e-03,
 2.2282e-02, -3.3440e-02,  1.9048e-02,
 2.3275e-02, -2.1153e-02, -2.0385e-02,
-4.6245e-02,  2.2443e-02, -3.0206e-02,
-2.5302e-02, -1.1418e-02,  4.8228e-02,
 5.8367e-02, -4.3062e-02,  2.2814e-02,
-4.6279e-02,  5.0052e-02,  2.2961e-02,
-5.4984e-02,  1.4773e-01, -2.5546e-02,
 3.3025e-02, -1.0138e-01,  6.3886e-02,
 1.2403e-02,  1.6215e-02,  1.0783e-02
}
,)"
R"(
{
 2.5042e-02, -5.3266e-02,  3.8484e-02,
 3.7189e-03,  1.0493e-01,  1.4459e-01,
-3.7442e-02, -1.5744e-01,  1.9957e-01,
-1.9203e-02,  1.6256e-02,  4.2906e-03,
-3.1637e-02,  5.0287e-01, -6.9504e-02,
 1.4677e-03, -8.9984e-02, -9.0376e-02,
 4.0578e-02,  2.4004e-02,  3.4044e-03,
 7.5916e-02, -1.3564e-01, -9.0296e-02,
 3.4156e-02,  7.2494e-02, -2.0037e-02,
-6.4614e-02, -1.7301e-03, -3.3444e-02,
-2.7950e-01,  7.1351e-01,  4.2825e-02,
 2.4797e-02,  5.4162e-04, -8.9676e-02,
 3.8002e-02, -2.7692e-02, -1.7757e-02,
 1.9356e-01,  1.9598e-02, -1.0862e-01,
 2.5734e-02,  1.1703e-02, -7.3912e-02,
-6.0213e-04,  1.6024e-01, -6.4591e-03,
 3.1779e-02, -3.1049e-01,  1.2684e-02,
-1.0098e-01, -1.8839e-01,  5.1387e-02,
 5.2004e-02,  3.1489e-01,  5.9716e-01,
-7.2238e-02,  3.4332e-01, -2.0655e-01,
 1.1013e-03, -5.0328e-02, -4.6118e-02,
 9.4442e-04,  2.7964e-02,  1.7672e-02,
-8.6022e-02, -3.8280e-02,  2.8017e-04,
 3.3824e-02, -6.7883e-02,  1.0529e-02,
-6.5982e-02,  1.1385e-01,  3.0091e-03,
 1.2330e-01,  6.1876e-01,  5.7145e-02,
-4.3835e-02, -6.8186e-01, -1.0917e-01,
 3.2006e-02, -2.0627e-03, -6.9043e-02,
 7.2219e-02, -3.2393e-01, -2.6657e-02,
 1.3523e-02,  1.8099e-01,  4.9168e-02,
 7.1367e-02,  9.8283e-02,  1.0425e-01,
 2.2286e-01, -5.9374e-01,  1.0014e-01,
 6.5700e-02,  1.3618e-02, -7.4045e-02,
 1.0481e-01,  3.0734e-02,  1.0431e-02,
-2.1314e-01, -7.2817e-02,  1.2036e-01,
-5.4180e-02,  1.0500e-01,  2.7821e-02,
-5.0657e-02,  8.7702e-02,  7.0234e-02,
 9.0349e-02,  1.4905e-01,  1.1612e-01,
 5.9924e-02,  2.4928e-01,  1.7078e-01,
-5.9110e-02, -7.4252e-02,  9.8241e-03,
-1.2006e-01,  1.3879e-01, -1.4322e-02,
-7.5463e-02,  1.4407e-02, -6.9202e-03,
 7.0279e-02,  1.7065e-01, -2.5150e-01,
-2.6289e-02,  3.8421e-01, -2.2051e-01,
-2.8918e-02,  4.0074e-02, -7.1296e-02,
 1.0357e-01, -1.8885e-01,  2.3780e-02,
-1.8884e-01, -4.3326e-01, -1.1465e-01,
 3.3497e-02, -1.3462e-01, -3.4127e-02,
-1.2731e-02,  5.4326e-02, -2.6581e-02,
 5.1753e-02,  6.8200e-03,  4.3246e-03,
-6.9963e-02, -1.5618e-01,  2.5192e-01,
 2.2890e-02,  6.1421e-02,  5.2832e-02,
-9.8369e-02, -1.1452e-01,  1.7420e-01,
 2.0392e-01, -1.1322e-01,  9.8462e-02,
-3.3547e-02, -2.8993e-01,  7.0080e-02,
 8.2478e-02, -1.9881e-01,  1.2849e-01,
-2.7802e-01, -1.5621e-01,  6.2712e-02,
 1.3028e-02,  1.4716e-01,  2.0434e-02,
-4.4071e-01,  3.8359e-01, -1.6655e-03,
-2.0297e-01,  1.5631e-01,  7.7086e-02,
 9.6714e-03, -5.5842e-03,  7.9155e-03,
 1.4525e-01, -3.2228e-01,  1.1454e-01,
 1.4527e-01, -3.0399e-02, -6.7043e-02,
 9.4233e-03, -1.1296e-02, -1.0927e-01,
 7.9300e-02,  5.5286e-02, -1.1558e-01,
 3.8173e-01, -5.4351e-02, -1.7890e-01,
 5.4882e-02,  1.5119e-01,  1.8363e-01,
-8.8223e-02, -9.0083e-02,  4.8221e-01,
 4.0890e-02,  5.6429e-02, -2.8538e-01,
 1.2102e-02, -1.8177e-02, -3.1643e-03,
-6.9064e-02,  3.1853e-04, -7.0113e-02,
 9.7308e-02,  1.0691e-01, -6.5919e-02,
-1.4536e-40, -1.7049e-40, -2.6781e-40,
 4.5792e-40,  1.4489e-40,  1.3645e-40,
-5.8774e-40, -2.2505e-40, -4.7571e-40,
 3.3670e-40,  1.5398e-40, -3.3819e-40,
 2.6303e-40, -1.9434e-40, -5.5555e-40,
-4.3830e-40, -2.8750e-40, -3.0788e-41,
 5.6364e-40,  3.1307e-40, -2.3064e-41,
 2.8909e-40, -5.8115e-40,  2.9852e-41,
-1.9273e-40, -7.5503e-41, -6.0335e-40,
 5.8073e-40,  2.9252e-40, -1.3038e-40,
 5.2260e-40,  3.8172e-40, -2.0389e-40,
-2.1905e-41,  1.8473e-40, -2.9226e-40,
 2.9957e-41,  2.6068e-40,  6.1324e-40,
-4.3013e-41,  5.1421e-40, -4.1157e-40,
 2.1416e-41, -1.6614e-40, -3.0843e-42,
-4.3402e-40,  2.8507e-40,  1.1560e-40,
 3.8826e-40, -3.0797e-40, -6.0685e-40,
 5.4170e-40, -6.1858e-40,  9.3049e-41,
-1.9491e-40, -1.9211e-40, -6.2723e-40,
 3.9906e-40,  1.2356e-40,  3.8682e-40,
 2.8630e-40,  6.2303e-40,  5.3034e-40,
-4.1904e-40,  4.8916e-40, -3.6125e-40,
-5.5393e-40, -2.4980e-40, -6.1877e-40,
 2.7289e-40, -1.8348e-40, -5.6663e-40,
 2.5152e-02, -3.2878e-02,  2.1626e-02,
 1.9879e-01,  2.9080e-02, -3.0331e-03,
-2.3380e-01, -2.3578e-02,  1.1871e-01,
-3.1824e-02, -5.5095e-02,  3.1338e-02,
-3.2199e-02, -4.3820e-01,  4.1391e-02,
-4.1207e-02,  3.7475e-01, -1.8548e-01,
-1.4460e-02, -8.7834e-02, -3.2343e-02,
 2.4023e-01,  7.1916e-01, -1.8559e-01,
-6.7635e-03, -9.4409e-02, -1.7890e-02,
-5.8334e-02,  1.8886e-01,  6.1547e-02,
-2.6152e-01,  6.6722e-01, -1.2486e-01,
-4.8128e-02,  1.0510e-01, -4.2619e-02,
 3.0101e-03,  9.6380e-02,  6.6140e-02,
 1.0201e-01, -2.3240e-01, -1.8356e-01,
 4.0019e-02,  2.2985e-01, -1.2980e-01,
-1.1400e-01, -1.9221e-01, -3.4158e-02,
 2.2871e-02, -6.8684e-01, -1.0856e-02,
 2.6311e-02,  2.5422e-02, -1.5190e-02,
 3.2182e-02, -5.6346e-02,  3.2655e-02,
-1.6912e-02,  8.4264e-02, -7.9521e-02,
 1.2788e-03, -7.1110e-02,  8.6585e-02,
-4.2829e-02,  1.0778e-01, -6.8129e-02,
 5.8156e-03, -2.3998e-01,  1.9052e-01,
-4.1855e-02,  1.0140e-01, -1.7139e-02,
 5.2301e-40, -2.9923e-40,  3.8688e-41,
 3.1575e-40,  1.1504e-40,  5.5655e-40,
-3.4499e-40,  2.3050e-40, -6.3766e-41,
 1.3282e-40,  4.5849e-40,  3.5308e-40,
-2.6657e-41,  5.9829e-40,  3.2791e-40,
-2.8348e-40,  2.5810e-40,  5.5791e-40,
 4.2613e-40,  3.2607e-40, -2.0789e-40,
-3.9054e-40, -2.5608e-40, -2.7638e-40,
 4.5027e-40,  2.7065e-40, -4.5593e-40,
 1.6336e-40, -2.0391e-40, -5.9017e-41,
-7.9899e-41, -2.9870e-40,  5.6390e-40,
-2.5560e-41, -1.9786e-40,  9.4700e-41,
-7.4049e-41, -2.3902e-40, -2.8497e-40,
-1.8912e-40, -1.5589e-40,  5.5463e-40,
-2.1782e-40, -1.9532e-40, -2.3785e-40,
 2.7539e-40,  4.0214e-40,  2.0732e-40,
 7.0120e-41, -4.4200e-40,  7.3787e-41,
 2.6452e-40,  1.1970e-40,  2.8298e-40,
 5.2721e-40,  1.9304e-40, -3.8489e-40,
-3.9759e-40,  2.6184e-40,  1.2594e-40,
 1.5831e-40,  3.7179e-40, -3.4915e-40,
-1.7681e-40, -6.9657e-41, -4.0746e-40,
 8.0894e-41,  1.6950e-40, -1.0574e-40,
-1.0590e-40,  2.8466e-41, -2.7558e-40,
-5.4027e-40,  4.4355e-41, -3.2144e-40,
-4.8838e-41, -3.8595e-40,  2.5064e-40,
 4.0365e-40, -1.0195e-40,  4.8356e-40,
 4.4499e-40, -4.4871e-40, -2.4561e-40,
 4.1687e-40,  5.2239e-40, -5.7603e-41,
-1.5211e-40, -3.5768e-40,  3.6385e-40,
 1.6089e-40,  4.1624e-40,  4.5114e-40,
 1.6438e-40, -3.6331e-40,  6.4961e-41,
 5.0899e-40,  6.1036e-40,  2.4828e-40,
 5.8681e-40, -5.7259e-40, -1.5371e-40,
 5.2654e-40,  4.7412e-40, -2.0265e-40,
-4.8621e-41,  4.9497e-40,  3.0176e-40,
 4.2235e-40,  4.5381e-40,  4.6501e-40,
-1.6124e-40, -1.9449e-40,  5.1497e-40,
-1.2891e-40, -1.6549e-40,  4.8348e-40,
-2.0735e-40,  1.3423e-41, -4.4109e-40,
-5.4218e-40, -1.1537e-40, -1.1664e-40,
 5.6006e-40,  3.4109e-40, -3.1434e-40,
 3.4969e-40, -5.3459e-40,  3.9245e-41,
 2.4028e-40,  5.7774e-40, -6.2973e-40,
 1.8802e-40, -4.6258e-41, -5.0716e-40,
 3.4962e-40, -6.2313e-41, -2.7290e-40,
-5.2709e-40, -3.2225e-40,  2.4245e-40,
-3.6300e-40, -2.0794e-40,  4.0541e-40,
-3.5157e-02,  6.8337e-02,  1.6149e-02,
-5.8650e-03,  6.0605e-01,  3.1738e-02,
 9.3306e-02,  2.1499e-01,  1.3609e-01,
 6.4043e-02, -1.0253e-02, -6.2813e-04,
 4.6828e-02, -3.9619e-01, -9.2633e-03,
-8.1752e-02,  9.9083e-02,  4.4296e-03,
 7.1594e-02,  3.9860e-02,  8.1088e-02,
 1.7750e-01, -1.2381e-01,  1.4476e-01,
 2.3416e-02,  1.2819e-01,  1.0816e-02,
 5.5296e-02,  5.5199e-02, -2.1253e-02,
 1.7214e-01,  2.0542e-01, -3.7859e-03,
 1.2831e-01,  3.2087e-02, -5.1851e-02,
-2.3686e-02,  1.2271e-01, -1.6009e-02,
-2.0176e-01,  7.4757e-01, -3.4526e-02,
-4.7055e-02, -3.7099e-01, -1.9216e-01,
-8.8030e-02, -2.5853e-02, -1.7087e-02,
-2.0533e-01,  1.5214e-01, -1.8639e-03,
-1.1236e-01, -2.4612e-01,  6.3094e-02,
 2.3829e-02, -5.0078e-03,  5.3854e-02,
-9.6934e-03,  3.7047e-02,  4.7325e-01,
 5.6975e-03, -8.6108e-02,  6.5569e-02,
-3.9768e-03,  2.0580e-02, -4.1931e-02,
 6.9577e-02, -1.0416e-01, -2.5037e-03,
-1.9198e-02,  6.2027e-02, -1.0833e-02
}
,)"
R"(
{
-5.3430e-40,  2.5717e-41,  5.7504e-40,
 7.1679e-41,  6.2076e-40, -8.4201e-41,
-4.2111e-40,  3.4851e-40,  1.3009e-40,
 3.3016e-40, -7.6473e-41, -1.8392e-40,
 2.2773e-41,  1.2087e-40,  1.1565e-40,
 6.5190e-41,  2.0075e-40,  2.5796e-40,
 5.0575e-40, -2.6261e-40, -2.5486e-40,
-3.9886e-40, -6.0644e-40,  2.9264e-40,
 8.9627e-41, -3.0550e-40, -2.3456e-40,
-4.8855e-40, -4.8867e-40, -5.0492e-40,
-1.0706e-40,  5.3827e-40, -1.6413e-40,
 1.4714e-40, -3.4024e-40, -4.4881e-40,
 3.2361e-40,  2.0858e-40,  3.8836e-40,
 2.0949e-40,  5.9633e-40, -1.7878e-41,
-4.1980e-40, -4.4383e-40,  2.7859e-40,
 7.0317e-42, -8.9973e-41,  5.8700e-41,
 1.8411e-40, -3.6097e-42,  2.7362e-40,
 5.4341e-40,  6.0305e-40,  5.9004e-40,
 5.2692e-40, -6.3449e-41,  1.2075e-40,
 7.5297e-41,  8.9267e-41,  4.9139e-40,
-1.4609e-40,  3.1821e-41,  2.3288e-40,
 3.1748e-41, -3.8052e-40, -2.4322e-40,
-5.7959e-40,  6.1966e-40,  3.4964e-40,
-5.6776e-40, -6.8327e-41, -3.3777e-41,
-5.9108e-02,  3.5468e-02, -2.8772e-02,
 6.8602e-01,  1.4232e-01,  1.1954e-02,
-3.8234e-02,  7.1837e-02, -1.8832e-02,
 4.7972e-02,  1.1623e-02, -2.1687e-03,
-4.9744e-01,  2.7751e-01,  1.7862e-02,
 7.4286e-02,  3.1309e-03,  1.1030e-03,
-6.1084e-01, -8.5679e-03,  9.4956e-03,
-4.5246e-01, -1.2126e-01, -3.7368e-02,
 2.5624e-02,  1.2087e-02, -1.5431e-02,
 6.0313e-40,  1.8404e-40, -7.2006e-41,
 6.0697e-40, -9.1199e-41,  5.8965e-40,
 5.4830e-40,  1.3014e-40,  1.5585e-41,
-3.6027e-02, -6.3004e-03,  1.5237e-02,
 6.0743e-01,  9.2523e-02, -4.7370e-03,
 3.4407e-02, -8.3823e-02,  1.6898e-02,
 5.7527e-40, -5.0621e-40, -2.9035e-42,
 3.8199e-40, -2.2913e-40, -5.0895e-40,
 4.0079e-40,  5.1744e-40, -3.3006e-40,
 6.1448e-40,  1.2347e-40, -3.1673e-40,
 7.3214e-41,  5.2143e-40, -2.6071e-40,
 1.6109e-40, -2.0298e-40,  9.5817e-41,
 6.9876e-02, -2.9290e-02,  3.2294e-03,
-4.2632e-01,  1.5789e-01,  3.6809e-02,
 2.1220e-02,  1.6531e-04,  6.8502e-03,
-6.5221e-02,  8.8059e-02,  5.7934e-03,
-1.7280e-01,  1.5303e-01,  1.7663e-01,
-1.2908e-01, -1.1749e-01,  5.7887e-02,
 1.0685e-01,  2.2763e-01,  3.3796e-02,
 1.7629e-01,  3.8882e-01,  6.3540e-02,
 6.4707e-02,  1.0046e-01, -8.1911e-02,
-3.9718e-03,  4.6416e-02,  4.7357e-02,
 7.3694e-02, -1.6444e-01,  2.4784e-02,
-3.0808e-03,  2.7399e-02, -2.9216e-04,
 2.4428e-40, -3.0160e-40,  2.3184e-40,
-4.9114e-40,  5.6685e-40, -3.6020e-40,
 2.2618e-40, -2.8145e-40,  2.1149e-40,
 2.3559e-02, -8.6949e-02, -3.8350e-02,
-2.9547e-01,  7.0187e-01, -8.3979e-02,
-2.8576e-02, -1.6538e-01, -5.2465e-02,
-1.6016e-40, -1.4760e-40, -2.1977e-40,
 4.3180e-40,  4.1724e-40, -1.2969e-40,
-1.3023e-40, -1.0095e-40, -1.5965e-40,
-4.0721e-40, -4.1747e-40, -4.3706e-40,
-4.2838e-40, -4.5507e-40, -4.6023e-40,
-3.7435e-40, -3.9889e-40, -4.2249e-40,
-1.2429e-01, -3.5062e-01, -1.1418e-01,
-4.0787e-02,  6.1690e-01, -1.0085e-01,
 1.6098e-02,  8.5100e-02, -1.1621e-02,
 3.0709e-40, -4.4880e-40, -2.7530e-41,
-1.2649e-40, -5.3936e-40,  5.0995e-41,
 4.4003e-40, -2.1211e-40, -6.6422e-43,
-1.8989e-40, -3.6631e-40,  4.1392e-40,
-3.9057e-40, -5.5599e-40,  6.9979e-41,
 3.8983e-40,  5.6737e-41,  2.3997e-40,
-9.4862e-41,  2.4256e-40, -3.7040e-40,
 1.6374e-40,  3.5439e-42, -1.0385e-40,
 3.6145e-40, -2.4342e-41, -3.0115e-40,
-6.0009e-40, -5.2386e-41, -1.2504e-40,
 2.9237e-40, -1.2290e-40, -1.1502e-40,
-3.5887e-40, -6.1810e-40, -1.6289e-41,
 2.5438e-41,  5.1229e-40, -2.4915e-40,
 1.3516e-40,  3.3553e-40,  8.5831e-41,
-8.5122e-41,  3.7625e-41,  2.5507e-40,
-1.5828e-40,  2.1991e-40, -1.5628e-40,
-5.3110e-40,  5.1395e-40, -5.8162e-40,
-3.1571e-40, -5.5139e-40,  1.2299e-40,
 4.8855e-40, -9.3940e-41, -6.2534e-40,
-3.3275e-40, -2.4982e-40, -1.2956e-40,
-6.0047e-40, -1.8712e-41, -7.3274e-42,
-2.8519e-40,  3.5541e-40,  2.4485e-40,
-8.1435e-41, -2.7091e-40,  7.1206e-41,
-5.9519e-41, -2.5552e-40, -3.6189e-40,
 7.7038e-02, -1.6317e-02, -2.4118e-02,
-4.3086e-02, -2.1512e-01,  1.2288e-01,
 1.8237e-01, -1.5438e-01, -1.1346e-01,
-4.6141e-02, -4.0750e-02, -5.6414e-04,
-1.5640e-01, -3.4506e-01, -1.4441e-02,
-2.0278e-01, -3.1403e-01, -6.2542e-02,
-1.9622e-02,  1.6348e-02,  6.9859e-03,
-9.3142e-02,  1.0368e-02, -5.6585e-02,
 8.4213e-02,  1.0776e-01, -1.0315e-01,
 8.7873e-41, -5.3947e-40,  1.1714e-40,
 7.5534e-41, -1.1871e-40, -5.4012e-40,
 3.8269e-41, -1.4913e-40, -3.1802e-40,
-3.4707e-02,  1.2518e-02,  9.4679e-03,
 1.2254e-01,  1.9394e-01,  2.6530e-02,
 2.2413e-01, -1.6298e-01, -6.1446e-02,
-1.1042e-42, -2.7255e-40, -5.5067e-40,
 3.8272e-40,  4.9956e-40, -3.2074e-41,
 2.8351e-40,  4.2501e-40,  3.9389e-41,
 6.1941e-40, -4.8790e-40, -3.4137e-40,
 2.2577e-40, -5.7183e-40, -8.6861e-41,
 5.7021e-40, -3.2349e-40,  1.9655e-40,
 9.1180e-02,  5.6665e-02, -6.5437e-04,
 1.1759e-01,  2.7517e-01,  1.9143e-01,
 9.7905e-02,  6.6707e-02,  8.6535e-02,
 8.8717e-03,  3.0913e-02,  6.6909e-03,
-8.1791e-02, -4.7883e-01,  7.4920e-02,
 4.5843e-01, -1.0410e-01,  1.6655e-01,
-4.7094e-03,  3.4769e-02, -1.3291e-02,
-8.5570e-03, -4.0038e-01,  1.8418e-01,
-1.4696e-01,  3.2279e-01,  2.5712e-02,
-2.6207e-01, -4.6150e-02, -6.4099e-02,
-3.2623e-01, -1.8984e-01, -5.7891e-02,
-2.2088e-01, -4.2042e-02, -2.5307e-02,
 1.0260e-40,  5.0443e-40,  7.5150e-41,
 1.4402e-40, -5.1952e-40, -5.3810e-40,
 6.2240e-40,  1.8661e-40, -8.2983e-41,
 7.1850e-02,  4.8770e-02, -1.5081e-02,
 4.8072e-01,  2.5477e-01,  3.8197e-02,
 2.6011e-01,  2.4610e-01, -3.6167e-02,
 3.8901e-40,  1.6760e-41,  2.8471e-40,
 3.1983e-40,  1.2460e-40, -4.3961e-40,
 3.9187e-40,  2.7818e-40, -9.1501e-41,
-2.3320e-40, -1.9998e-40, -2.8132e-40,
-2.9552e-40, -3.9643e-40, -5.1375e-40,
-1.6686e-40, -5.3138e-40, -2.6988e-40,
 2.5623e-02,  2.6942e-02,  2.4342e-02,
-9.9084e-02,  5.2974e-01, -6.7983e-02,
-2.2454e-01,  1.1507e-01,  2.0364e-02,
 3.4852e-01, -3.1091e-01,  8.1154e-02,
-3.2205e-01,  1.7103e-01,  2.4162e-01,
-2.6892e-03,  2.4142e-02,  5.5540e-02,
-4.5753e-02, -5.0097e-01,  1.7503e-01,
 1.4058e-01,  1.1311e-01,  1.5945e-01,
-5.3975e-02,  5.2326e-02, -6.2382e-02,
 9.4114e-02, -5.6812e-01, -1.2081e-01,
-8.5809e-02, -9.8661e-03, -2.3064e-02,
-1.6453e-03, -1.8328e-02,  2.4282e-03,
 1.5943e-40,  4.6894e-40, -6.2730e-40,
 3.8054e-40, -3.7914e-41, -1.4429e-40,
 1.6925e-40,  5.1566e-41, -1.7909e-40,
-3.7920e-02,  2.4698e-01,  5.0019e-02,
-1.4246e-02,  2.8739e-01, -5.4704e-02,
 7.9436e-02, -2.7838e-02, -3.4191e-02,
-3.3565e-40,  2.1368e-40,  6.7346e-42,
 5.6681e-40, -5.5776e-40, -2.7705e-40,
-2.2966e-40,  1.1692e-40, -2.5187e-40,
 4.4806e-40, -4.8424e-40, -9.1436e-41,
-4.3250e-40, -2.0721e-40, -2.0050e-40,
-5.1061e-40,  2.6405e-40, -3.0913e-40,
-1.2078e-01,  3.1948e-01,  1.0082e-02,
-1.0781e-02,  8.0720e-02, -4.6330e-02,
-1.8084e-02, -2.2846e-02, -5.5861e-03,
-3.2400e-02, -1.7329e-01, -2.7995e-02,
-5.3680e-02,  4.1310e-01, -9.4691e-02,
 7.6938e-02, -4.9596e-02,  1.9649e-01,
 3.2594e-02,  1.1544e-01, -1.8501e-02,
 7.0248e-02, -6.9838e-02, -5.4278e-02,
-2.9317e-02, -1.4890e-01,  7.8661e-02,
 3.7685e-02,  5.9594e-02,  8.9527e-02,
 2.2957e-01, -2.9681e-01, -1.6329e-01,
-1.3206e-01, -4.3808e-02,  3.8854e-02,
 1.7529e-40, -3.8429e-41,  1.4443e-40,
-4.0829e-40, -2.5643e-40, -5.4821e-40,
 1.6827e-40, -1.1628e-40,  2.2441e-40,
 5.2451e-02,  1.0179e-01,  4.8487e-02,
-2.1020e-01, -4.4345e-01, -8.7642e-02,
 7.0958e-02,  1.9934e-01, -2.1090e-02,
-3.0795e-41,  2.7921e-40,  2.8491e-40,
-2.1154e-40,  9.8876e-41, -8.8824e-41,
 2.6552e-40,  2.5767e-40, -3.8369e-40,
 6.1348e-40, -3.4170e-40, -1.7109e-40,
-3.3080e-40,  5.4199e-41, -1.7512e-40,
 1.8363e-40, -4.4080e-40, -2.5508e-40,
-4.0716e-02, -2.8531e-01,  3.9981e-02,
 2.2278e-02,  5.6661e-01, -8.3890e-02,
-7.7331e-02, -9.3843e-02,  1.5584e-02
}
,)"
R"(
{
-3.6751e-40, -5.4562e-41,  6.1860e-40,
 8.9003e-41,  5.5262e-40,  3.9537e-40,
-2.1258e-42, -3.1069e-40, -7.6225e-41,
-1.2220e-02, -8.6886e-02,  1.0714e-02,
 1.1656e-02, -7.3635e-02,  5.9427e-02,
 4.8518e-03,  1.3543e-01,  1.4668e-02,
-1.7505e-02, -2.0691e-02, -1.4507e-02,
 2.6157e-02,  7.4109e-02,  1.2822e-02,
-1.9737e-02, -4.9281e-02,  8.5962e-03,
 5.6236e-40,  2.4616e-40,  1.6384e-40,
-3.9469e-40, -1.7094e-40,  1.9285e-40,
-1.3634e-40, -1.5785e-40,  6.4184e-41,
-1.2752e-02,  2.3150e-02, -5.3355e-03,
-5.9667e-02, -3.9580e-01, -7.0033e-02,
-2.2612e-02,  1.9176e-02,  1.0588e-02,
 8.0027e-04,  3.2242e-01, -2.2566e-02,
 8.7850e-03, -2.4025e-01,  4.6123e-02,
-1.9038e-02, -8.5750e-03, -4.8153e-03,
-1.3049e-03, -5.7771e-03,  9.6437e-03,
 3.2477e-02,  2.4482e-01,  4.0580e-02,
 1.3194e-02, -4.6602e-01, -6.6163e-02,
-1.0647e-01,  7.3328e-02,  2.5871e-02,
-7.0883e-02, -9.2725e-02, -1.5185e-02,
 1.1804e-02,  1.7784e-03, -4.4099e-03,
-4.9226e-40, -1.3081e-40, -3.5969e-40,
 4.3539e-40, -2.9631e-40,  2.3531e-41,
 5.6191e-40,  6.1545e-41, -1.1112e-40,
-1.1880e-02, -3.1884e-02, -2.0850e-02,
-6.8633e-03,  1.6422e-01,  1.0281e+00,
 3.5887e-03,  2.1180e-01, -1.0094e-01,
-1.5103e-02, -4.9074e-02, -1.7702e-02,
 7.2119e-02,  3.3199e-02, -9.7082e-04,
 5.5383e-02,  1.0343e-01,  2.5156e-02,
 2.9049e-40, -1.6397e-40, -8.8848e-41,
-6.2827e-40,  8.1281e-41,  5.2909e-40,
-4.1132e-40,  1.5751e-40,  1.5400e-40,
-7.3765e-02, -4.9723e-02,  4.9357e-02,
-2.4207e-02, -1.0291e-01, -1.4001e-03,
-1.2751e-02,  4.2805e-03,  1.8934e-03,
 2.6862e-02,  1.1634e-01,  4.5666e-02,
-4.7351e-03, -4.1593e-01,  3.6082e-02,
 1.1446e-02, -5.2026e-03,  1.8672e-02,
-7.0960e-04, -6.7877e-03,  9.6674e-03,
-4.9952e-03,  8.8664e-02, -2.7707e-02,
 8.5309e-02,  5.5513e-02, -7.6230e-02,
 3.6354e-02,  9.7794e-02,  1.1687e-02,
 2.6847e-02,  3.2565e-01, -8.7710e-03,
-2.0372e-02, -1.9090e-02, -3.2566e-03,
-5.5592e-40,  7.4408e-41,  3.5576e-40,
 2.7758e-40,  4.5458e-41, -6.2347e-40,
 9.9739e-41, -1.6078e-40, -5.2900e-40,
 1.1500e-02, -3.0675e-01, -3.0079e-02,
 1.5080e-02, -2.4292e-01,  1.2736e-01,
-1.9513e-02, -1.9376e-02, -8.5960e-02,
-1.0241e-01, -2.1312e-02, -3.1999e-02,
-6.3598e-02,  1.5187e-01,  1.2279e-01,
 1.5695e-03,  1.1376e-01,  5.2648e-03,
 2.6415e-40,  3.0508e-40,  3.6407e-41,
-1.4403e-40,  2.8942e-40, -1.0089e-40,
 2.2362e-41,  1.9843e-40, -1.5509e-40,
 1.3269e-01, -3.1031e-01, -4.4091e-02,
 4.6385e-03,  2.1411e-02,  5.7141e-02,
 2.0724e-02, -3.5406e-02,  2.5717e-03,
-5.5922e-02,  7.1404e-01, -2.9852e-02,
 1.3041e-02,  3.9373e-02, -2.4515e-01,
 4.4278e-03,  2.1557e-02, -8.4940e-03,
 1.3677e-02, -3.5183e-02,  1.2391e-02,
-9.2405e-02,  2.9650e-01,  6.9695e-02,
-3.3125e-02,  3.4700e-01,  1.4552e-01,
 2.7357e-02,  5.2133e-01, -5.7571e-02,
 2.7580e-02,  1.0381e-01,  1.3678e-02,
 4.9260e-03, -4.4419e-02,  7.0651e-04,
 2.9472e-40, -5.2892e-40, -3.6567e-40,
 4.9403e-40, -6.2132e-40, -6.2920e-40,
-1.5156e-40, -3.6134e-40,  5.2432e-40,
-5.0427e-03, -2.8247e-03, -5.3734e-02,
-1.5918e-02,  1.8325e-01, -1.7834e-01,
-5.1774e-03,  8.0009e-02,  5.6296e-03,
 3.1480e-02,  2.0665e-02,  2.7806e-04,
 7.3085e-02,  7.7660e-01,  1.1979e-01,
 1.9979e-02,  1.6629e-01,  2.3216e-02,
-5.9701e-40,  9.5583e-41,  1.8231e-40,
-3.3216e-40, -4.1253e-40, -3.3326e-40,
 1.7131e-40,  2.9588e-40, -2.2520e-40,
-1.3337e-01, -4.2777e-01, -1.3569e-01,
 2.9915e-02, -2.7016e-01, -3.7454e-03,
-1.3574e-02, -3.6298e-02, -1.6571e-02,
 4.2530e-02, -4.2299e-02,  1.4320e-01,
 1.4371e-02, -1.1289e-01, -3.8829e-02,
 5.1689e-03,  1.5804e-02,  1.6125e-03,
-3.4601e-03, -7.2087e-03, -5.5514e-04,
 4.4568e-02,  1.3621e-01, -4.3811e-02,
 1.1350e-02, -2.8417e-01,  3.1553e-02,
-7.8854e-02, -2.0316e-01,  7.7746e-03,
-1.1437e-02,  2.1557e-01, -1.9479e-02,
-1.3511e-02, -2.0339e-02, -1.0276e-02,
-8.8977e-41,  5.9533e-40, -3.1413e-40,
-3.1892e-40,  5.5204e-40, -5.0634e-40,
-2.4932e-41,  4.3474e-41,  6.2961e-40,
 4.7864e-03,  5.7125e-02, -1.5468e-02,
-3.9614e-03, -2.9042e-02,  2.8347e-01,
-1.0133e-02,  8.2745e-02, -1.0450e-01,
 5.9537e-03,  1.4050e-02,  1.9802e-04,
 2.4964e-02,  1.3077e-01, -4.7314e-02,
 6.2744e-03, -1.9068e-01,  5.2593e-02,
-2.0550e-40, -2.4231e-40,  3.3927e-40,
-3.9609e-41,  2.2262e-40,  1.8866e-40,
 2.0788e-40, -1.8012e-40, -1.9375e-40,
-4.7530e-03, -1.2315e-01,  8.2373e-03,
-9.2412e-02,  1.7156e-01,  1.1176e-02,
-1.4081e-02,  1.4694e-02, -1.9475e-02,
-1.5269e-02, -3.8430e-02, -7.4717e-02,
 3.3361e-02, -1.1956e-01,  4.2304e-01,
-2.9924e-03, -3.3035e-02, -3.6560e-02,
-1.2386e-02,  6.3762e-03, -3.7047e-02,
 1.3839e-02, -3.6358e-02,  4.3609e-02,
-8.3692e-03,  4.5794e-01, -3.0761e-01,
 2.2287e-02,  2.5360e-02, -6.1253e-03,
-1.8992e-02, -4.0078e-01,  7.3821e-02,
 5.6517e-03,  4.2348e-02, -2.5642e-02,
 5.5659e-40, -6.1219e-40,  4.1493e-40,
 5.7719e-42, -3.7181e-40, -3.3260e-40,
-4.8241e-41,  5.2207e-40, -1.2199e-40,
-1.2074e-02,  1.7647e-01,  1.1882e-02,
 6.4764e-03, -2.3742e-01, -1.8033e-01,
 2.5866e-02,  6.5985e-02,  3.7191e-02,
 5.1047e-02, -3.0457e-02,  1.2531e-02,
-1.3252e-01,  1.2593e-01, -6.3717e-02,
 4.0794e-02, -1.4786e-02,  1.7139e-02,
 2.4343e-40, -1.7451e-40,  2.0169e-40,
-5.5166e-40,  2.4201e-40, -2.5701e-40,
 2.9947e-40,  2.9321e-40, -1.6015e-40,
-3.6598e-02, -1.8520e-03, -1.6999e-01,
-8.6806e-02, -7.7266e-02, -9.6042e-02,
-2.1342e-02,  2.5793e-02, -7.2541e-03,
 3.0667e-02, -2.6287e-01,  3.0592e-02,
-4.5559e-02, -1.4716e-01,  2.0932e-01,
-5.8472e-03, -1.0023e-02,  1.2134e-02,
-1.3284e-02,  2.0538e-02, -5.4476e-04,
 5.8096e-02, -1.4790e-02, -2.0158e-02,
-3.9654e-02, -2.2069e-01, -1.5089e-01,
-1.8966e-01, -1.6834e-01,  9.8934e-02,
 8.2326e-02,  7.5585e-02, -1.7188e-02,
-1.4985e-02,  2.1823e-02, -7.7015e-03,
 1.8353e-40,  4.8298e-40, -2.0568e-40,
-3.7196e-40, -5.7237e-40,  1.0648e-40,
 9.4960e-41,  3.0411e-40,  1.3294e-40,
-1.4884e-02,  4.9767e-02, -3.0288e-02,
 8.9874e-03, -1.0290e-01,  3.1344e-01,
 5.9735e-03, -2.0813e-01, -6.6145e-03,
 1.6592e-02,  3.0529e-05, -1.0180e-02,
-4.8683e-02,  1.4025e-01,  2.9237e-02,
-2.3334e-02, -9.6638e-02, -1.0268e-02,
-4.9497e-41, -5.6377e-40, -2.0142e-40,
 2.1230e-40,  1.6067e-40,  3.4830e-40,
-4.9031e-40, -3.0290e-40, -2.9060e-40,
 3.4053e-02, -8.9560e-02, -4.4479e-02,
 4.2128e-02,  6.9253e-02, -7.1096e-03,
 4.2358e-02, -1.7215e-02,  9.0389e-03,
 1.8129e-02, -1.4785e-01,  1.1267e-01,
-7.1637e-02,  5.5595e-01, -1.0569e-02,
 1.8481e-02, -4.7556e-02, -1.1185e-02,
-1.1766e-02, -8.5959e-03, -3.0046e-02,
-2.1081e-03,  1.1518e-01, -8.4419e-02,
-7.5829e-02,  1.8199e-01, -9.7726e-03,
 3.6473e-02,  1.8761e-01,  4.9495e-03,
-6.9640e-02, -2.8775e-01,  3.6149e-02,
 9.6345e-04,  1.3967e-02, -6.0015e-03,
 2.9861e-40,  3.9190e-40,  5.3741e-40,
 3.8059e-40,  4.7113e-40,  5.9498e-40,
-5.0640e-40, -4.1610e-40,  6.2009e-40,
-2.3464e-03, -7.3888e-02,  3.4701e-02,
-5.2257e-04,  3.8444e-02, -5.3735e-01,
-1.7970e-03,  9.0298e-02,  5.3151e-02,
-2.6033e-02,  1.2973e-02,  4.9147e-03,
 2.3005e-02,  1.7045e-01,  2.4715e-02,
 2.7981e-02, -8.4662e-02, -9.4778e-03,
 5.3019e-40, -2.1800e-40,  1.5281e-40,
-1.0282e-40,  1.8040e-41,  1.3929e-40,
-5.9679e-40, -5.2958e-40,  1.4429e-40,
 3.4325e-02, -1.7240e-01, -4.9645e-02,
-2.4341e-02,  5.2652e-02, -1.1188e-02,
-3.6336e-03,  4.2148e-04,  3.3086e-03,
 5.5059e-03,  1.7744e-01, -2.8681e-02,
-3.4868e-03, -1.4569e-01,  1.6508e-02,
 4.6766e-03, -1.7963e-02, -2.6397e-03,
 4.3618e-03, -4.2793e-03, -4.7820e-04,
-4.2795e-02,  2.0070e-01,  3.8402e-02,
 5.0586e-02,  2.1910e-01, -3.4381e-02,
 5.7625e-02,  4.2314e-01, -1.9732e-02,
 3.4811e-02, -2.3033e-01,  1.1477e-02,
-7.3744e-03,  1.9112e-02,  4.2251e-03
}
};
)"+std::string(
R"(
__constant float biasL[8][8] = 
{
{
 0.0272, -0.5743, -0.0333, -0.0334,  0.0082, -0.0263, -0.0048, -0.0167
}
,
{
-0.0239, -0.0385,  0.0026,  0.0288, -0.0225,  0.0082, -0.0191, -0.0185
}
,
{
-5.8305e-03, -8.6574e-02,  4.2228e-02, -4.3500e-02, -8.1892e-04, 3.3171e-03, -1.1582e-02, -4.1205e-40
}
,
{
-0.0053,  0.0053, -0.0114, -0.0127, -0.0039, -0.0426,  0.0053, -0.0017
}
,
{
-0.0046, -0.0104, -0.0087, -0.0040,  0.1077,  0.0347, -0.0165,  0.7296
}
,
{
 8.7612e-02,  5.9126e-01,  4.6709e-03, -1.1559e-39,  2.3381e-02, -1.2136e-40, -5.6040e-39,  3.7100e-02
}
,
{
-3.3246e-39, -1.4536e-02, -6.3362e-02,  8.5347e-41,  7.9956e-02, 3.0679e-04, -1.0257e-02, -1.2037e-02
}
,
{
-0.0006,  0.0117,  0.0083,  0.0686, -0.0046,  0.0015, -0.0076,  0.0079
}
};

__constant float kernelsL10[4 * 8] = 
{
 0.4908, -0.0457,
-0.1716, -0.2115,
-0.0015, -0.3152,
 0.3045,  0.0330,
-0.2981,  0.0912,
 0.0122,  0.2281,
 0.3331,  0.2853,
 0.2210,  0.2611,
 0.2364,  0.0792,
 0.2885, -0.7122,
-0.3715,  0.1404,
-0.0260,  0.2144,
 0.2378,  0.1570,
-0.5734,  0.2077,
-0.0851,  0.2771,
 0.0415, -0.1858
};


__kernel void conv1To8(
    __read_only image2d_t srcImg, 
    __write_only image2d_t tmpImgOut1, 
    __write_only image2d_t tmpImgOut2)
{
    const int x = get_global_id(0), y = get_global_id(1);
    if(x >= get_image_width(srcImg) || y >= get_image_height(srcImg))
        return;

    int2 coord = (int2)(x, y);

    float4 tl = read_imagef(srcImg, samplerN, (int2)(x-1,y-1));
    float4 tc = read_imagef(srcImg, samplerN, (int2)(x,y-1));
    float4 tr = read_imagef(srcImg, samplerN, (int2)(x+1,y-1));
    float4 ml = read_imagef(srcImg, samplerN, (int2)(x-1,y));
    float4 mc = read_imagef(srcImg, samplerN, coord);
    float4 mr = read_imagef(srcImg, samplerN, (int2)(x+1,y));
    float4 bl = read_imagef(srcImg, samplerN, (int2)(x-1,y+1));
    float4 bc = read_imagef(srcImg, samplerN, (int2)(x,y+1));
    float4 br = read_imagef(srcImg, samplerN, (int2)(x+1,y+1));

    float4 c1234 = RELU((float4)(
        tl.x * kernelsL1[0*9+0] + tc.x * kernelsL1[0*9+1] + tr.x * kernelsL1[0*9+2] +
        ml.x * kernelsL1[0*9+3] + mc.x * kernelsL1[0*9+4] + mr.x * kernelsL1[0*9+5] +
        bl.x * kernelsL1[0*9+6] + bc.x * kernelsL1[0*9+7] + br.x * kernelsL1[0*9+8] + biasL1[0],

        tl.x * kernelsL1[1*9+0] + tc.x * kernelsL1[1*9+1] + tr.x * kernelsL1[1*9+2] +
        ml.x * kernelsL1[1*9+3] + mc.x * kernelsL1[1*9+4] + mr.x * kernelsL1[1*9+5] +
        bl.x * kernelsL1[1*9+6] + bc.x * kernelsL1[1*9+7] + br.x * kernelsL1[1*9+8] + biasL1[1],

        tl.x * kernelsL1[2*9+0] + tc.x * kernelsL1[2*9+1] + tr.x * kernelsL1[2*9+2] +
        ml.x * kernelsL1[2*9+3] + mc.x * kernelsL1[2*9+4] + mr.x * kernelsL1[2*9+5] +
        bl.x * kernelsL1[2*9+6] + bc.x * kernelsL1[2*9+7] + br.x * kernelsL1[2*9+8] + biasL1[2],

        tl.x * kernelsL1[3*9+0] + tc.x * kernelsL1[3*9+1] + tr.x * kernelsL1[3*9+2] +
        ml.x * kernelsL1[3*9+3] + mc.x * kernelsL1[3*9+4] + mr.x * kernelsL1[3*9+5] +
        bl.x * kernelsL1[3*9+6] + bc.x * kernelsL1[3*9+7] + br.x * kernelsL1[3*9+8] + biasL1[3]
    ));
    float4 c5678 = RELU((float4)(
        tl.x * kernelsL1[4*9+0] + tc.x * kernelsL1[4*9+1] + tr.x * kernelsL1[4*9+2] +
        ml.x * kernelsL1[4*9+3] + mc.x * kernelsL1[4*9+4] + mr.x * kernelsL1[4*9+5] +
        bl.x * kernelsL1[4*9+6] + bc.x * kernelsL1[4*9+7] + br.x * kernelsL1[4*9+8] + biasL1[4],

        tl.x * kernelsL1[5*9+0] + tc.x * kernelsL1[5*9+1] + tr.x * kernelsL1[5*9+2] +
        ml.x * kernelsL1[5*9+3] + mc.x * kernelsL1[5*9+4] + mr.x * kernelsL1[5*9+5] +
        bl.x * kernelsL1[5*9+6] + bc.x * kernelsL1[5*9+7] + br.x * kernelsL1[5*9+8] + biasL1[5],

        tl.x * kernelsL1[6*9+0] + tc.x * kernelsL1[6*9+1] + tr.x * kernelsL1[6*9+2] +
        ml.x * kernelsL1[6*9+3] + mc.x * kernelsL1[6*9+4] + mr.x * kernelsL1[6*9+5] +
        bl.x * kernelsL1[6*9+6] + bc.x * kernelsL1[6*9+7] + br.x * kernelsL1[6*9+8] + biasL1[6],

        tl.x * kernelsL1[7*9+0] + tc.x * kernelsL1[7*9+1] + tr.x * kernelsL1[7*9+2] +
        ml.x * kernelsL1[7*9+3] + mc.x * kernelsL1[7*9+4] + mr.x * kernelsL1[7*9+5] +
        bl.x * kernelsL1[7*9+6] + bc.x * kernelsL1[7*9+7] + br.x * kernelsL1[7*9+8] + biasL1[7]
    ));

    write_imagef(tmpImgOut1, coord, c1234);
    write_imagef(tmpImgOut2, coord, c5678);
}
)"
R"(
__kernel void conv8To8(
    __read_only image2d_t tmpImgIn1,
    __read_only image2d_t tmpImgIn2, 
    __write_only image2d_t tmpImgOut1, 
    __write_only image2d_t tmpImgOut2,
    int l)
{
    const int x = get_global_id(0), y = get_global_id(1);
    if(x >= get_image_width(tmpImgIn1) || y >= get_image_height(tmpImgIn1))
        return;

    int2 coord = (int2)(x, y);

    float4 tl1 = read_imagef(tmpImgIn1, samplerN, (int2)(x-1,y-1));
    float4 tc1 = read_imagef(tmpImgIn1, samplerN, (int2)(x,y-1));
    float4 tr1 = read_imagef(tmpImgIn1, samplerN, (int2)(x+1,y-1));
    float4 ml1 = read_imagef(tmpImgIn1, samplerN, (int2)(x-1,y));
    float4 mc1 = read_imagef(tmpImgIn1, samplerN, coord);
    float4 mr1 = read_imagef(tmpImgIn1, samplerN, (int2)(x+1,y));
    float4 bl1 = read_imagef(tmpImgIn1, samplerN, (int2)(x-1,y+1));
    float4 bc1 = read_imagef(tmpImgIn1, samplerN, (int2)(x,y+1));
    float4 br1 = read_imagef(tmpImgIn1, samplerN, (int2)(x+1,y+1));

    float4 tl2 = read_imagef(tmpImgIn2, samplerN, (int2)(x-1,y-1));
    float4 tc2 = read_imagef(tmpImgIn2, samplerN, (int2)(x,y-1));
    float4 tr2 = read_imagef(tmpImgIn2, samplerN, (int2)(x+1,y-1));
    float4 ml2 = read_imagef(tmpImgIn2, samplerN, (int2)(x-1,y));
    float4 mc2 = read_imagef(tmpImgIn2, samplerN, coord);
    float4 mr2 = read_imagef(tmpImgIn2, samplerN, (int2)(x+1,y));
    float4 bl2 = read_imagef(tmpImgIn2, samplerN, (int2)(x-1,y+1));
    float4 bc2 = read_imagef(tmpImgIn2, samplerN, (int2)(x,y+1));
    float4 br2 = read_imagef(tmpImgIn2, samplerN, (int2)(x+1,y+1));
    
    float4 c1234 = RELU((float4)(
        tl1.x * kernelsL[l][0*72+0*9+0] + tc1.x * kernelsL[l][0*72+0*9+1] + tr1.x * kernelsL[l][0*72+0*9+2] +
        ml1.x * kernelsL[l][0*72+0*9+3] + mc1.x * kernelsL[l][0*72+0*9+4] + mr1.x * kernelsL[l][0*72+0*9+5] +
        bl1.x * kernelsL[l][0*72+0*9+6] + bc1.x * kernelsL[l][0*72+0*9+7] + br1.x * kernelsL[l][0*72+0*9+8] + 

        tl1.y * kernelsL[l][0*72+1*9+0] + tc1.y * kernelsL[l][0*72+1*9+1] + tr1.y * kernelsL[l][0*72+1*9+2] +
        ml1.y * kernelsL[l][0*72+1*9+3] + mc1.y * kernelsL[l][0*72+1*9+4] + mr1.y * kernelsL[l][0*72+1*9+5] +
        bl1.y * kernelsL[l][0*72+1*9+6] + bc1.y * kernelsL[l][0*72+1*9+7] + br1.y * kernelsL[l][0*72+1*9+8] + 

        tl1.z * kernelsL[l][0*72+2*9+0] + tc1.z * kernelsL[l][0*72+2*9+1] + tr1.z * kernelsL[l][0*72+2*9+2] +
        ml1.z * kernelsL[l][0*72+2*9+3] + mc1.z * kernelsL[l][0*72+2*9+4] + mr1.z * kernelsL[l][0*72+2*9+5] +
        bl1.z * kernelsL[l][0*72+2*9+6] + bc1.z * kernelsL[l][0*72+2*9+7] + br1.z * kernelsL[l][0*72+2*9+8] + 

        tl1.w * kernelsL[l][0*72+3*9+0] + tc1.w * kernelsL[l][0*72+3*9+1] + tr1.w * kernelsL[l][0*72+3*9+2] +
        ml1.w * kernelsL[l][0*72+3*9+3] + mc1.w * kernelsL[l][0*72+3*9+4] + mr1.w * kernelsL[l][0*72+3*9+5] +
        bl1.w * kernelsL[l][0*72+3*9+6] + bc1.w * kernelsL[l][0*72+3*9+7] + br1.w * kernelsL[l][0*72+3*9+8] +

        tl2.x * kernelsL[l][0*72+4*9+0] + tc2.x * kernelsL[l][0*72+4*9+1] + tr2.x * kernelsL[l][0*72+4*9+2] +
        ml2.x * kernelsL[l][0*72+4*9+3] + mc2.x * kernelsL[l][0*72+4*9+4] + mr2.x * kernelsL[l][0*72+4*9+5] +
        bl2.x * kernelsL[l][0*72+4*9+6] + bc2.x * kernelsL[l][0*72+4*9+7] + br2.x * kernelsL[l][0*72+4*9+8] + 

        tl2.y * kernelsL[l][0*72+5*9+0] + tc2.y * kernelsL[l][0*72+5*9+1] + tr2.y * kernelsL[l][0*72+5*9+2] +
        ml2.y * kernelsL[l][0*72+5*9+3] + mc2.y * kernelsL[l][0*72+5*9+4] + mr2.y * kernelsL[l][0*72+5*9+5] +
        bl2.y * kernelsL[l][0*72+5*9+6] + bc2.y * kernelsL[l][0*72+5*9+7] + br2.y * kernelsL[l][0*72+5*9+8] + 

        tl2.z * kernelsL[l][0*72+6*9+0] + tc2.z * kernelsL[l][0*72+6*9+1] + tr2.z * kernelsL[l][0*72+6*9+2] +
        ml2.z * kernelsL[l][0*72+6*9+3] + mc2.z * kernelsL[l][0*72+6*9+4] + mr2.z * kernelsL[l][0*72+6*9+5] +
        bl2.z * kernelsL[l][0*72+6*9+6] + bc2.z * kernelsL[l][0*72+6*9+7] + br2.z * kernelsL[l][0*72+6*9+8] + 

        tl2.w * kernelsL[l][0*72+7*9+0] + tc2.w * kernelsL[l][0*72+7*9+1] + tr2.w * kernelsL[l][0*72+7*9+2] +
        ml2.w * kernelsL[l][0*72+7*9+3] + mc2.w * kernelsL[l][0*72+7*9+4] + mr2.w * kernelsL[l][0*72+7*9+5] +
        bl2.w * kernelsL[l][0*72+7*9+6] + bc2.w * kernelsL[l][0*72+7*9+7] + br2.w * kernelsL[l][0*72+7*9+8] + biasL[l][0]
        ,
        tl1.x * kernelsL[l][1*72+0*9+0] + tc1.x * kernelsL[l][1*72+0*9+1] + tr1.x * kernelsL[l][1*72+0*9+2] +
        ml1.x * kernelsL[l][1*72+0*9+3] + mc1.x * kernelsL[l][1*72+0*9+4] + mr1.x * kernelsL[l][1*72+0*9+5] +
        bl1.x * kernelsL[l][1*72+0*9+6] + bc1.x * kernelsL[l][1*72+0*9+7] + br1.x * kernelsL[l][1*72+0*9+8] + 

        tl1.y * kernelsL[l][1*72+1*9+0] + tc1.y * kernelsL[l][1*72+1*9+1] + tr1.y * kernelsL[l][1*72+1*9+2] +
        ml1.y * kernelsL[l][1*72+1*9+3] + mc1.y * kernelsL[l][1*72+1*9+4] + mr1.y * kernelsL[l][1*72+1*9+5] +
        bl1.y * kernelsL[l][1*72+1*9+6] + bc1.y * kernelsL[l][1*72+1*9+7] + br1.y * kernelsL[l][1*72+1*9+8] + 

        tl1.z * kernelsL[l][1*72+2*9+0] + tc1.z * kernelsL[l][1*72+2*9+1] + tr1.z * kernelsL[l][1*72+2*9+2] +
        ml1.z * kernelsL[l][1*72+2*9+3] + mc1.z * kernelsL[l][1*72+2*9+4] + mr1.z * kernelsL[l][1*72+2*9+5] +
        bl1.z * kernelsL[l][1*72+2*9+6] + bc1.z * kernelsL[l][1*72+2*9+7] + br1.z * kernelsL[l][1*72+2*9+8] + 

        tl1.w * kernelsL[l][1*72+3*9+0] + tc1.w * kernelsL[l][1*72+3*9+1] + tr1.w * kernelsL[l][1*72+3*9+2] +
        ml1.w * kernelsL[l][1*72+3*9+3] + mc1.w * kernelsL[l][1*72+3*9+4] + mr1.w * kernelsL[l][1*72+3*9+5] +
        bl1.w * kernelsL[l][1*72+3*9+6] + bc1.w * kernelsL[l][1*72+3*9+7] + br1.w * kernelsL[l][1*72+3*9+8] +

        tl2.x * kernelsL[l][1*72+4*9+0] + tc2.x * kernelsL[l][1*72+4*9+1] + tr2.x * kernelsL[l][1*72+4*9+2] +
        ml2.x * kernelsL[l][1*72+4*9+3] + mc2.x * kernelsL[l][1*72+4*9+4] + mr2.x * kernelsL[l][1*72+4*9+5] +
        bl2.x * kernelsL[l][1*72+4*9+6] + bc2.x * kernelsL[l][1*72+4*9+7] + br2.x * kernelsL[l][1*72+4*9+8] + 

        tl2.y * kernelsL[l][1*72+5*9+0] + tc2.y * kernelsL[l][1*72+5*9+1] + tr2.y * kernelsL[l][1*72+5*9+2] +
        ml2.y * kernelsL[l][1*72+5*9+3] + mc2.y * kernelsL[l][1*72+5*9+4] + mr2.y * kernelsL[l][1*72+5*9+5] +
        bl2.y * kernelsL[l][1*72+5*9+6] + bc2.y * kernelsL[l][1*72+5*9+7] + br2.y * kernelsL[l][1*72+5*9+8] + 

        tl2.z * kernelsL[l][1*72+6*9+0] + tc2.z * kernelsL[l][1*72+6*9+1] + tr2.z * kernelsL[l][1*72+6*9+2] +
        ml2.z * kernelsL[l][1*72+6*9+3] + mc2.z * kernelsL[l][1*72+6*9+4] + mr2.z * kernelsL[l][1*72+6*9+5] +
        bl2.z * kernelsL[l][1*72+6*9+6] + bc2.z * kernelsL[l][1*72+6*9+7] + br2.z * kernelsL[l][1*72+6*9+8] + 

        tl2.w * kernelsL[l][1*72+7*9+0] + tc2.w * kernelsL[l][1*72+7*9+1] + tr2.w * kernelsL[l][1*72+7*9+2] +
        ml2.w * kernelsL[l][1*72+7*9+3] + mc2.w * kernelsL[l][1*72+7*9+4] + mr2.w * kernelsL[l][1*72+7*9+5] +
        bl2.w * kernelsL[l][1*72+7*9+6] + bc2.w * kernelsL[l][1*72+7*9+7] + br2.w * kernelsL[l][1*72+7*9+8] + biasL[l][1]
        ,
        tl1.x * kernelsL[l][2*72+0*9+0] + tc1.x * kernelsL[l][2*72+0*9+1] + tr1.x * kernelsL[l][2*72+0*9+2] +
        ml1.x * kernelsL[l][2*72+0*9+3] + mc1.x * kernelsL[l][2*72+0*9+4] + mr1.x * kernelsL[l][2*72+0*9+5] +
        bl1.x * kernelsL[l][2*72+0*9+6] + bc1.x * kernelsL[l][2*72+0*9+7] + br1.x * kernelsL[l][2*72+0*9+8] + 

        tl1.y * kernelsL[l][2*72+1*9+0] + tc1.y * kernelsL[l][2*72+1*9+1] + tr1.y * kernelsL[l][2*72+1*9+2] +
        ml1.y * kernelsL[l][2*72+1*9+3] + mc1.y * kernelsL[l][2*72+1*9+4] + mr1.y * kernelsL[l][2*72+1*9+5] +
        bl1.y * kernelsL[l][2*72+1*9+6] + bc1.y * kernelsL[l][2*72+1*9+7] + br1.y * kernelsL[l][2*72+1*9+8] + 

        tl1.z * kernelsL[l][2*72+2*9+0] + tc1.z * kernelsL[l][2*72+2*9+1] + tr1.z * kernelsL[l][2*72+2*9+2] +
        ml1.z * kernelsL[l][2*72+2*9+3] + mc1.z * kernelsL[l][2*72+2*9+4] + mr1.z * kernelsL[l][2*72+2*9+5] +
        bl1.z * kernelsL[l][2*72+2*9+6] + bc1.z * kernelsL[l][2*72+2*9+7] + br1.z * kernelsL[l][2*72+2*9+8] + 

        tl1.w * kernelsL[l][2*72+3*9+0] + tc1.w * kernelsL[l][2*72+3*9+1] + tr1.w * kernelsL[l][2*72+3*9+2] +
        ml1.w * kernelsL[l][2*72+3*9+3] + mc1.w * kernelsL[l][2*72+3*9+4] + mr1.w * kernelsL[l][2*72+3*9+5] +
        bl1.w * kernelsL[l][2*72+3*9+6] + bc1.w * kernelsL[l][2*72+3*9+7] + br1.w * kernelsL[l][2*72+3*9+8] +

        tl2.x * kernelsL[l][2*72+4*9+0] + tc2.x * kernelsL[l][2*72+4*9+1] + tr2.x * kernelsL[l][2*72+4*9+2] +
        ml2.x * kernelsL[l][2*72+4*9+3] + mc2.x * kernelsL[l][2*72+4*9+4] + mr2.x * kernelsL[l][2*72+4*9+5] +
        bl2.x * kernelsL[l][2*72+4*9+6] + bc2.x * kernelsL[l][2*72+4*9+7] + br2.x * kernelsL[l][2*72+4*9+8] + 

        tl2.y * kernelsL[l][2*72+5*9+0] + tc2.y * kernelsL[l][2*72+5*9+1] + tr2.y * kernelsL[l][2*72+5*9+2] +
        ml2.y * kernelsL[l][2*72+5*9+3] + mc2.y * kernelsL[l][2*72+5*9+4] + mr2.y * kernelsL[l][2*72+5*9+5] +
        bl2.y * kernelsL[l][2*72+5*9+6] + bc2.y * kernelsL[l][2*72+5*9+7] + br2.y * kernelsL[l][2*72+5*9+8] + 

        tl2.z * kernelsL[l][2*72+6*9+0] + tc2.z * kernelsL[l][2*72+6*9+1] + tr2.z * kernelsL[l][2*72+6*9+2] +
        ml2.z * kernelsL[l][2*72+6*9+3] + mc2.z * kernelsL[l][2*72+6*9+4] + mr2.z * kernelsL[l][2*72+6*9+5] +
        bl2.z * kernelsL[l][2*72+6*9+6] + bc2.z * kernelsL[l][2*72+6*9+7] + br2.z * kernelsL[l][2*72+6*9+8] + 

        tl2.w * kernelsL[l][2*72+7*9+0] + tc2.w * kernelsL[l][2*72+7*9+1] + tr2.w * kernelsL[l][2*72+7*9+2] +
        ml2.w * kernelsL[l][2*72+7*9+3] + mc2.w * kernelsL[l][2*72+7*9+4] + mr2.w * kernelsL[l][2*72+7*9+5] +
        bl2.w * kernelsL[l][2*72+7*9+6] + bc2.w * kernelsL[l][2*72+7*9+7] + br2.w * kernelsL[l][2*72+7*9+8] + biasL[l][2]
        ,
        tl1.x * kernelsL[l][3*72+0*9+0] + tc1.x * kernelsL[l][3*72+0*9+1] + tr1.x * kernelsL[l][3*72+0*9+2] +
        ml1.x * kernelsL[l][3*72+0*9+3] + mc1.x * kernelsL[l][3*72+0*9+4] + mr1.x * kernelsL[l][3*72+0*9+5] +
        bl1.x * kernelsL[l][3*72+0*9+6] + bc1.x * kernelsL[l][3*72+0*9+7] + br1.x * kernelsL[l][3*72+0*9+8] + 

        tl1.y * kernelsL[l][3*72+1*9+0] + tc1.y * kernelsL[l][3*72+1*9+1] + tr1.y * kernelsL[l][3*72+1*9+2] +
        ml1.y * kernelsL[l][3*72+1*9+3] + mc1.y * kernelsL[l][3*72+1*9+4] + mr1.y * kernelsL[l][3*72+1*9+5] +
        bl1.y * kernelsL[l][3*72+1*9+6] + bc1.y * kernelsL[l][3*72+1*9+7] + br1.y * kernelsL[l][3*72+1*9+8] + 

        tl1.z * kernelsL[l][3*72+2*9+0] + tc1.z * kernelsL[l][3*72+2*9+1] + tr1.z * kernelsL[l][3*72+2*9+2] +
        ml1.z * kernelsL[l][3*72+2*9+3] + mc1.z * kernelsL[l][3*72+2*9+4] + mr1.z * kernelsL[l][3*72+2*9+5] +
        bl1.z * kernelsL[l][3*72+2*9+6] + bc1.z * kernelsL[l][3*72+2*9+7] + br1.z * kernelsL[l][3*72+2*9+8] + 

        tl1.w * kernelsL[l][3*72+3*9+0] + tc1.w * kernelsL[l][3*72+3*9+1] + tr1.w * kernelsL[l][3*72+3*9+2] +
        ml1.w * kernelsL[l][3*72+3*9+3] + mc1.w * kernelsL[l][3*72+3*9+4] + mr1.w * kernelsL[l][3*72+3*9+5] +
        bl1.w * kernelsL[l][3*72+3*9+6] + bc1.w * kernelsL[l][3*72+3*9+7] + br1.w * kernelsL[l][3*72+3*9+8] +

        tl2.x * kernelsL[l][3*72+4*9+0] + tc2.x * kernelsL[l][3*72+4*9+1] + tr2.x * kernelsL[l][3*72+4*9+2] +
        ml2.x * kernelsL[l][3*72+4*9+3] + mc2.x * kernelsL[l][3*72+4*9+4] + mr2.x * kernelsL[l][3*72+4*9+5] +
        bl2.x * kernelsL[l][3*72+4*9+6] + bc2.x * kernelsL[l][3*72+4*9+7] + br2.x * kernelsL[l][3*72+4*9+8] + 

        tl2.y * kernelsL[l][3*72+5*9+0] + tc2.y * kernelsL[l][3*72+5*9+1] + tr2.y * kernelsL[l][3*72+5*9+2] +
        ml2.y * kernelsL[l][3*72+5*9+3] + mc2.y * kernelsL[l][3*72+5*9+4] + mr2.y * kernelsL[l][3*72+5*9+5] +
        bl2.y * kernelsL[l][3*72+5*9+6] + bc2.y * kernelsL[l][3*72+5*9+7] + br2.y * kernelsL[l][3*72+5*9+8] + 

        tl2.z * kernelsL[l][3*72+6*9+0] + tc2.z * kernelsL[l][3*72+6*9+1] + tr2.z * kernelsL[l][3*72+6*9+2] +
        ml2.z * kernelsL[l][3*72+6*9+3] + mc2.z * kernelsL[l][3*72+6*9+4] + mr2.z * kernelsL[l][3*72+6*9+5] +
        bl2.z * kernelsL[l][3*72+6*9+6] + bc2.z * kernelsL[l][3*72+6*9+7] + br2.z * kernelsL[l][3*72+6*9+8] + 

        tl2.w * kernelsL[l][3*72+7*9+0] + tc2.w * kernelsL[l][3*72+7*9+1] + tr2.w * kernelsL[l][3*72+7*9+2] +
        ml2.w * kernelsL[l][3*72+7*9+3] + mc2.w * kernelsL[l][3*72+7*9+4] + mr2.w * kernelsL[l][3*72+7*9+5] +
        bl2.w * kernelsL[l][3*72+7*9+6] + bc2.w * kernelsL[l][3*72+7*9+7] + br2.w * kernelsL[l][3*72+7*9+8] + biasL[l][3]
    ));)"
    R"(
    float4 c5678 = RELU((float4)(
        tl1.x * kernelsL[l][4*72+0*9+0] + tc1.x * kernelsL[l][4*72+0*9+1] + tr1.x * kernelsL[l][4*72+0*9+2] +
        ml1.x * kernelsL[l][4*72+0*9+3] + mc1.x * kernelsL[l][4*72+0*9+4] + mr1.x * kernelsL[l][4*72+0*9+5] +
        bl1.x * kernelsL[l][4*72+0*9+6] + bc1.x * kernelsL[l][4*72+0*9+7] + br1.x * kernelsL[l][4*72+0*9+8] + 

        tl1.y * kernelsL[l][4*72+1*9+0] + tc1.y * kernelsL[l][4*72+1*9+1] + tr1.y * kernelsL[l][4*72+1*9+2] +
        ml1.y * kernelsL[l][4*72+1*9+3] + mc1.y * kernelsL[l][4*72+1*9+4] + mr1.y * kernelsL[l][4*72+1*9+5] +
        bl1.y * kernelsL[l][4*72+1*9+6] + bc1.y * kernelsL[l][4*72+1*9+7] + br1.y * kernelsL[l][4*72+1*9+8] + 

        tl1.z * kernelsL[l][4*72+2*9+0] + tc1.z * kernelsL[l][4*72+2*9+1] + tr1.z * kernelsL[l][4*72+2*9+2] +
        ml1.z * kernelsL[l][4*72+2*9+3] + mc1.z * kernelsL[l][4*72+2*9+4] + mr1.z * kernelsL[l][4*72+2*9+5] +
        bl1.z * kernelsL[l][4*72+2*9+6] + bc1.z * kernelsL[l][4*72+2*9+7] + br1.z * kernelsL[l][4*72+2*9+8] + 

        tl1.w * kernelsL[l][4*72+3*9+0] + tc1.w * kernelsL[l][4*72+3*9+1] + tr1.w * kernelsL[l][4*72+3*9+2] +
        ml1.w * kernelsL[l][4*72+3*9+3] + mc1.w * kernelsL[l][4*72+3*9+4] + mr1.w * kernelsL[l][4*72+3*9+5] +
        bl1.w * kernelsL[l][4*72+3*9+6] + bc1.w * kernelsL[l][4*72+3*9+7] + br1.w * kernelsL[l][4*72+3*9+8] +

        tl2.x * kernelsL[l][4*72+4*9+0] + tc2.x * kernelsL[l][4*72+4*9+1] + tr2.x * kernelsL[l][4*72+4*9+2] +
        ml2.x * kernelsL[l][4*72+4*9+3] + mc2.x * kernelsL[l][4*72+4*9+4] + mr2.x * kernelsL[l][4*72+4*9+5] +
        bl2.x * kernelsL[l][4*72+4*9+6] + bc2.x * kernelsL[l][4*72+4*9+7] + br2.x * kernelsL[l][4*72+4*9+8] + 

        tl2.y * kernelsL[l][4*72+5*9+0] + tc2.y * kernelsL[l][4*72+5*9+1] + tr2.y * kernelsL[l][4*72+5*9+2] +
        ml2.y * kernelsL[l][4*72+5*9+3] + mc2.y * kernelsL[l][4*72+5*9+4] + mr2.y * kernelsL[l][4*72+5*9+5] +
        bl2.y * kernelsL[l][4*72+5*9+6] + bc2.y * kernelsL[l][4*72+5*9+7] + br2.y * kernelsL[l][4*72+5*9+8] + 

        tl2.z * kernelsL[l][4*72+6*9+0] + tc2.z * kernelsL[l][4*72+6*9+1] + tr2.z * kernelsL[l][4*72+6*9+2] +
        ml2.z * kernelsL[l][4*72+6*9+3] + mc2.z * kernelsL[l][4*72+6*9+4] + mr2.z * kernelsL[l][4*72+6*9+5] +
        bl2.z * kernelsL[l][4*72+6*9+6] + bc2.z * kernelsL[l][4*72+6*9+7] + br2.z * kernelsL[l][4*72+6*9+8] + 

        tl2.w * kernelsL[l][4*72+7*9+0] + tc2.w * kernelsL[l][4*72+7*9+1] + tr2.w * kernelsL[l][4*72+7*9+2] +
        ml2.w * kernelsL[l][4*72+7*9+3] + mc2.w * kernelsL[l][4*72+7*9+4] + mr2.w * kernelsL[l][4*72+7*9+5] +
        bl2.w * kernelsL[l][4*72+7*9+6] + bc2.w * kernelsL[l][4*72+7*9+7] + br2.w * kernelsL[l][4*72+7*9+8] + biasL[l][4]
        ,
        tl1.x * kernelsL[l][5*72+0*9+0] + tc1.x * kernelsL[l][5*72+0*9+1] + tr1.x * kernelsL[l][5*72+0*9+2] +
        ml1.x * kernelsL[l][5*72+0*9+3] + mc1.x * kernelsL[l][5*72+0*9+4] + mr1.x * kernelsL[l][5*72+0*9+5] +
        bl1.x * kernelsL[l][5*72+0*9+6] + bc1.x * kernelsL[l][5*72+0*9+7] + br1.x * kernelsL[l][5*72+0*9+8] + 

        tl1.y * kernelsL[l][5*72+1*9+0] + tc1.y * kernelsL[l][5*72+1*9+1] + tr1.y * kernelsL[l][5*72+1*9+2] +
        ml1.y * kernelsL[l][5*72+1*9+3] + mc1.y * kernelsL[l][5*72+1*9+4] + mr1.y * kernelsL[l][5*72+1*9+5] +
        bl1.y * kernelsL[l][5*72+1*9+6] + bc1.y * kernelsL[l][5*72+1*9+7] + br1.y * kernelsL[l][5*72+1*9+8] + 

        tl1.z * kernelsL[l][5*72+2*9+0] + tc1.z * kernelsL[l][5*72+2*9+1] + tr1.z * kernelsL[l][5*72+2*9+2] +
        ml1.z * kernelsL[l][5*72+2*9+3] + mc1.z * kernelsL[l][5*72+2*9+4] + mr1.z * kernelsL[l][5*72+2*9+5] +
        bl1.z * kernelsL[l][5*72+2*9+6] + bc1.z * kernelsL[l][5*72+2*9+7] + br1.z * kernelsL[l][5*72+2*9+8] + 

        tl1.w * kernelsL[l][5*72+3*9+0] + tc1.w * kernelsL[l][5*72+3*9+1] + tr1.w * kernelsL[l][5*72+3*9+2] +
        ml1.w * kernelsL[l][5*72+3*9+3] + mc1.w * kernelsL[l][5*72+3*9+4] + mr1.w * kernelsL[l][5*72+3*9+5] +
        bl1.w * kernelsL[l][5*72+3*9+6] + bc1.w * kernelsL[l][5*72+3*9+7] + br1.w * kernelsL[l][5*72+3*9+8] +

        tl2.x * kernelsL[l][5*72+4*9+0] + tc2.x * kernelsL[l][5*72+4*9+1] + tr2.x * kernelsL[l][5*72+4*9+2] +
        ml2.x * kernelsL[l][5*72+4*9+3] + mc2.x * kernelsL[l][5*72+4*9+4] + mr2.x * kernelsL[l][5*72+4*9+5] +
        bl2.x * kernelsL[l][5*72+4*9+6] + bc2.x * kernelsL[l][5*72+4*9+7] + br2.x * kernelsL[l][5*72+4*9+8] + 

        tl2.y * kernelsL[l][5*72+5*9+0] + tc2.y * kernelsL[l][5*72+5*9+1] + tr2.y * kernelsL[l][5*72+5*9+2] +
        ml2.y * kernelsL[l][5*72+5*9+3] + mc2.y * kernelsL[l][5*72+5*9+4] + mr2.y * kernelsL[l][5*72+5*9+5] +
        bl2.y * kernelsL[l][5*72+5*9+6] + bc2.y * kernelsL[l][5*72+5*9+7] + br2.y * kernelsL[l][5*72+5*9+8] + 

        tl2.z * kernelsL[l][5*72+6*9+0] + tc2.z * kernelsL[l][5*72+6*9+1] + tr2.z * kernelsL[l][5*72+6*9+2] +
        ml2.z * kernelsL[l][5*72+6*9+3] + mc2.z * kernelsL[l][5*72+6*9+4] + mr2.z * kernelsL[l][5*72+6*9+5] +
        bl2.z * kernelsL[l][5*72+6*9+6] + bc2.z * kernelsL[l][5*72+6*9+7] + br2.z * kernelsL[l][5*72+6*9+8] + 

        tl2.w * kernelsL[l][5*72+7*9+0] + tc2.w * kernelsL[l][5*72+7*9+1] + tr2.w * kernelsL[l][5*72+7*9+2] +
        ml2.w * kernelsL[l][5*72+7*9+3] + mc2.w * kernelsL[l][5*72+7*9+4] + mr2.w * kernelsL[l][5*72+7*9+5] +
        bl2.w * kernelsL[l][5*72+7*9+6] + bc2.w * kernelsL[l][5*72+7*9+7] + br2.w * kernelsL[l][5*72+7*9+8] + biasL[l][5]
        ,
        tl1.x * kernelsL[l][6*72+0*9+0] + tc1.x * kernelsL[l][6*72+0*9+1] + tr1.x * kernelsL[l][6*72+0*9+2] +
        ml1.x * kernelsL[l][6*72+0*9+3] + mc1.x * kernelsL[l][6*72+0*9+4] + mr1.x * kernelsL[l][6*72+0*9+5] +
        bl1.x * kernelsL[l][6*72+0*9+6] + bc1.x * kernelsL[l][6*72+0*9+7] + br1.x * kernelsL[l][6*72+0*9+8] + 

        tl1.y * kernelsL[l][6*72+1*9+0] + tc1.y * kernelsL[l][6*72+1*9+1] + tr1.y * kernelsL[l][6*72+1*9+2] +
        ml1.y * kernelsL[l][6*72+1*9+3] + mc1.y * kernelsL[l][6*72+1*9+4] + mr1.y * kernelsL[l][6*72+1*9+5] +
        bl1.y * kernelsL[l][6*72+1*9+6] + bc1.y * kernelsL[l][6*72+1*9+7] + br1.y * kernelsL[l][6*72+1*9+8] + 

        tl1.z * kernelsL[l][6*72+2*9+0] + tc1.z * kernelsL[l][6*72+2*9+1] + tr1.z * kernelsL[l][6*72+2*9+2] +
        ml1.z * kernelsL[l][6*72+2*9+3] + mc1.z * kernelsL[l][6*72+2*9+4] + mr1.z * kernelsL[l][6*72+2*9+5] +
        bl1.z * kernelsL[l][6*72+2*9+6] + bc1.z * kernelsL[l][6*72+2*9+7] + br1.z * kernelsL[l][6*72+2*9+8] + 

        tl1.w * kernelsL[l][6*72+3*9+0] + tc1.w * kernelsL[l][6*72+3*9+1] + tr1.w * kernelsL[l][6*72+3*9+2] +
        ml1.w * kernelsL[l][6*72+3*9+3] + mc1.w * kernelsL[l][6*72+3*9+4] + mr1.w * kernelsL[l][6*72+3*9+5] +
        bl1.w * kernelsL[l][6*72+3*9+6] + bc1.w * kernelsL[l][6*72+3*9+7] + br1.w * kernelsL[l][6*72+3*9+8] +

        tl2.x * kernelsL[l][6*72+4*9+0] + tc2.x * kernelsL[l][6*72+4*9+1] + tr2.x * kernelsL[l][6*72+4*9+2] +
        ml2.x * kernelsL[l][6*72+4*9+3] + mc2.x * kernelsL[l][6*72+4*9+4] + mr2.x * kernelsL[l][6*72+4*9+5] +
        bl2.x * kernelsL[l][6*72+4*9+6] + bc2.x * kernelsL[l][6*72+4*9+7] + br2.x * kernelsL[l][6*72+4*9+8] + 

        tl2.y * kernelsL[l][6*72+5*9+0] + tc2.y * kernelsL[l][6*72+5*9+1] + tr2.y * kernelsL[l][6*72+5*9+2] +
        ml2.y * kernelsL[l][6*72+5*9+3] + mc2.y * kernelsL[l][6*72+5*9+4] + mr2.y * kernelsL[l][6*72+5*9+5] +
        bl2.y * kernelsL[l][6*72+5*9+6] + bc2.y * kernelsL[l][6*72+5*9+7] + br2.y * kernelsL[l][6*72+5*9+8] + 

        tl2.z * kernelsL[l][6*72+6*9+0] + tc2.z * kernelsL[l][6*72+6*9+1] + tr2.z * kernelsL[l][6*72+6*9+2] +
        ml2.z * kernelsL[l][6*72+6*9+3] + mc2.z * kernelsL[l][6*72+6*9+4] + mr2.z * kernelsL[l][6*72+6*9+5] +
        bl2.z * kernelsL[l][6*72+6*9+6] + bc2.z * kernelsL[l][6*72+6*9+7] + br2.z * kernelsL[l][6*72+6*9+8] + 

        tl2.w * kernelsL[l][6*72+7*9+0] + tc2.w * kernelsL[l][6*72+7*9+1] + tr2.w * kernelsL[l][6*72+7*9+2] +
        ml2.w * kernelsL[l][6*72+7*9+3] + mc2.w * kernelsL[l][6*72+7*9+4] + mr2.w * kernelsL[l][6*72+7*9+5] +
        bl2.w * kernelsL[l][6*72+7*9+6] + bc2.w * kernelsL[l][6*72+7*9+7] + br2.w * kernelsL[l][6*72+7*9+8] + biasL[l][6]
        ,
        tl1.x * kernelsL[l][7*72+0*9+0] + tc1.x * kernelsL[l][7*72+0*9+1] + tr1.x * kernelsL[l][7*72+0*9+2] +
        ml1.x * kernelsL[l][7*72+0*9+3] + mc1.x * kernelsL[l][7*72+0*9+4] + mr1.x * kernelsL[l][7*72+0*9+5] +
        bl1.x * kernelsL[l][7*72+0*9+6] + bc1.x * kernelsL[l][7*72+0*9+7] + br1.x * kernelsL[l][7*72+0*9+8] + 

        tl1.y * kernelsL[l][7*72+1*9+0] + tc1.y * kernelsL[l][7*72+1*9+1] + tr1.y * kernelsL[l][7*72+1*9+2] +
        ml1.y * kernelsL[l][7*72+1*9+3] + mc1.y * kernelsL[l][7*72+1*9+4] + mr1.y * kernelsL[l][7*72+1*9+5] +
        bl1.y * kernelsL[l][7*72+1*9+6] + bc1.y * kernelsL[l][7*72+1*9+7] + br1.y * kernelsL[l][7*72+1*9+8] + 

        tl1.z * kernelsL[l][7*72+2*9+0] + tc1.z * kernelsL[l][7*72+2*9+1] + tr1.z * kernelsL[l][7*72+2*9+2] +
        ml1.z * kernelsL[l][7*72+2*9+3] + mc1.z * kernelsL[l][7*72+2*9+4] + mr1.z * kernelsL[l][7*72+2*9+5] +
        bl1.z * kernelsL[l][7*72+2*9+6] + bc1.z * kernelsL[l][7*72+2*9+7] + br1.z * kernelsL[l][7*72+2*9+8] + 

        tl1.w * kernelsL[l][7*72+3*9+0] + tc1.w * kernelsL[l][7*72+3*9+1] + tr1.w * kernelsL[l][7*72+3*9+2] +
        ml1.w * kernelsL[l][7*72+3*9+3] + mc1.w * kernelsL[l][7*72+3*9+4] + mr1.w * kernelsL[l][7*72+3*9+5] +
        bl1.w * kernelsL[l][7*72+3*9+6] + bc1.w * kernelsL[l][7*72+3*9+7] + br1.w * kernelsL[l][7*72+3*9+8] +

        tl2.x * kernelsL[l][7*72+4*9+0] + tc2.x * kernelsL[l][7*72+4*9+1] + tr2.x * kernelsL[l][7*72+4*9+2] +
        ml2.x * kernelsL[l][7*72+4*9+3] + mc2.x * kernelsL[l][7*72+4*9+4] + mr2.x * kernelsL[l][7*72+4*9+5] +
        bl2.x * kernelsL[l][7*72+4*9+6] + bc2.x * kernelsL[l][7*72+4*9+7] + br2.x * kernelsL[l][7*72+4*9+8] + 

        tl2.y * kernelsL[l][7*72+5*9+0] + tc2.y * kernelsL[l][7*72+5*9+1] + tr2.y * kernelsL[l][7*72+5*9+2] +
        ml2.y * kernelsL[l][7*72+5*9+3] + mc2.y * kernelsL[l][7*72+5*9+4] + mr2.y * kernelsL[l][7*72+5*9+5] +
        bl2.y * kernelsL[l][7*72+5*9+6] + bc2.y * kernelsL[l][7*72+5*9+7] + br2.y * kernelsL[l][7*72+5*9+8] + 

        tl2.z * kernelsL[l][7*72+6*9+0] + tc2.z * kernelsL[l][7*72+6*9+1] + tr2.z * kernelsL[l][7*72+6*9+2] +
        ml2.z * kernelsL[l][7*72+6*9+3] + mc2.z * kernelsL[l][7*72+6*9+4] + mr2.z * kernelsL[l][7*72+6*9+5] +
        bl2.z * kernelsL[l][7*72+6*9+6] + bc2.z * kernelsL[l][7*72+6*9+7] + br2.z * kernelsL[l][7*72+6*9+8] + 

        tl2.w * kernelsL[l][7*72+7*9+0] + tc2.w * kernelsL[l][7*72+7*9+1] + tr2.w * kernelsL[l][7*72+7*9+2] +
        ml2.w * kernelsL[l][7*72+7*9+3] + mc2.w * kernelsL[l][7*72+7*9+4] + mr2.w * kernelsL[l][7*72+7*9+5] +
        bl2.w * kernelsL[l][7*72+7*9+6] + bc2.w * kernelsL[l][7*72+7*9+7] + br2.w * kernelsL[l][7*72+7*9+8] + biasL[l][7]
    ));

    write_imagef(tmpImgOut1, coord, c1234);
    write_imagef(tmpImgOut2, coord, c5678);
}
)"
R"(
__kernel void convTranspose8To1(
    __read_only image2d_t tmpImgIn1,
    __read_only image2d_t tmpImgIn2, 
    __write_only image2d_t dstImg)
{
    const int x = get_global_id(0), y = get_global_id(1);
    if(x >= get_image_width(dstImg) || y >= get_image_height(dstImg))
        return;

    int2 coord = (int2)(x, y);

    float4 mc1 = read_imagef(tmpImgIn1, samplerN, (int2)(x / 2, y / 2));
    float4 mc2 = read_imagef(tmpImgIn2, samplerN, (int2)(x / 2, y / 2));

    int2 pos = (int2)(x & 1, y & 1);
    int flag = 0;

    if (pos.x == 0 && pos.y != 0)
        flag = 0;
        //0 x
        //0 0
    else if (pos.x == 0 && pos.y == 0)
        flag = 1;
        //0 0
        //0 x
    else if (pos.x != 0 && pos.y == 0)
        flag = 2;
        //0 0
        //x 0
    else if (pos.x != 0 && pos.y != 0)
        flag = 3;
        //x 0
        //0 0

        //180 degree rotation for kernel
        //0 1  to  3 2
        //2 3      1 0
    float4 c;
    float tmp;
    switch(flag)
    {
    case 0:
        tmp = clamp(
            mc1.x * kernelsL10[0*4+2] +
            mc1.y * kernelsL10[1*4+2] +
            mc1.z * kernelsL10[2*4+2] +
            mc1.w * kernelsL10[3*4+2] +
            mc2.x * kernelsL10[4*4+2] +
            mc2.y * kernelsL10[5*4+2] +
            mc2.z * kernelsL10[6*4+2] +
            mc2.w * kernelsL10[7*4+2], 0.0f, 1.0f);
        
        c = (float4)(tmp, tmp, tmp, 1.0f);
        break;
    case 1:
        tmp = clamp(
            mc1.x * kernelsL10[0*4+0] +
            mc1.y * kernelsL10[1*4+0] +
            mc1.z * kernelsL10[2*4+0] +
            mc1.w * kernelsL10[3*4+0] +
            mc2.x * kernelsL10[4*4+0] +
            mc2.y * kernelsL10[5*4+0] +
            mc2.z * kernelsL10[6*4+0] +
            mc2.w * kernelsL10[7*4+0], 0.0f, 1.0f);

        c = (float4)(tmp, tmp, tmp, 1.0f);
        break;
    case 2:
        tmp = clamp(
            mc1.x * kernelsL10[0*4+1] +
            mc1.y * kernelsL10[1*4+1] +
            mc1.z * kernelsL10[2*4+1] +
            mc1.w * kernelsL10[3*4+1] +
            mc2.x * kernelsL10[4*4+1] +
            mc2.y * kernelsL10[5*4+1] +
            mc2.z * kernelsL10[6*4+1] +
            mc2.w * kernelsL10[7*4+1], 0.0f, 1.0f);
            
        c = (float4)(tmp, tmp, tmp, 1.0f);
        break;
    case 3:
        tmp = clamp(
            mc1.x * kernelsL10[0*4+3] +
            mc1.y * kernelsL10[1*4+3] +
            mc1.z * kernelsL10[2*4+3] +
            mc1.w * kernelsL10[3*4+3] +
            mc2.x * kernelsL10[4*4+3] +
            mc2.y * kernelsL10[5*4+3] +
            mc2.z * kernelsL10[6*4+3] +
            mc2.w * kernelsL10[7*4+3], 0.0f, 1.0f);
            
        c = (float4)(tmp, tmp, tmp, 1.0f);
        break;
    }

    write_imagef(dstImg, coord, c);
}
)");

const std::string Anime4KCPP::Anime4KGPUCNN::ACNetHDNKernelSourceString =
R"(#define RELU(x) fmax(x, 0.0f)

__constant sampler_t samplerN = CLK_NORMALIZED_COORDS_FALSE | CLK_ADDRESS_CLAMP | CLK_FILTER_NEAREST;

__constant float kernelsL1[9 * 8] = 
{
-6.6326e-02, -2.2316e-01,  4.2471e-02,
 1.7064e-02, -6.8305e-01, -1.5978e-01,
 6.7568e-01,  3.2212e-01,  8.3561e-02,
-4.6649e-01, -6.8789e-02,  5.3455e-01,
-5.0941e-01,  7.0657e-02,  4.5647e-01,
-2.3657e-02,  3.5302e-02, -1.8316e-02,
-2.0316e-01,  4.7021e-02, -2.2313e-01,
 5.3465e-02,  7.0750e-01,  9.1366e-02,
-2.8566e-01, -2.0521e-02, -7.1786e-02,
 4.8186e-02, -9.3429e-02,  2.4493e-03,
 3.4654e-01,  7.2625e-02,  1.6615e-01,
 3.2101e-01,  3.2923e-01, -9.8548e-02,
 1.1916e-02,  2.0413e-01, -1.8920e-02,
 6.0858e-02,  8.3548e-01,  1.4060e-01,
-9.1827e-01, -2.4551e-01, -4.6118e-02,
-5.2737e-02,  4.3151e-01,  1.7027e-01,
 2.6647e-01,  5.5240e-01,  3.4745e-03,
 5.3495e-02, -4.7059e-02, -2.6593e-02,
 1.5691e-01,  4.7332e-01,  2.6651e-03,
 1.7997e-02,  4.1367e-01,  1.3239e-02,
 4.6932e-02,  1.0278e-01,  1.0699e-02,
-3.4319e-02, -7.6373e-01, -9.7022e-02,
-1.4160e-01,  2.9567e-01,  6.6220e-01,
 7.3508e-05,  1.2683e-01, -6.3442e-02
};

__constant float biasL1[8] = 
{
-0.0264, -0.0229, -0.3021, -0.2579, -0.0327, -0.0053, -0.7777,  0.0232
};
)"
R"(
__constant float kernelsL[8][9 * 8 * 8] = 
{
{
-7.8588e-41, -5.0770e-40, -2.3334e-40,
 5.7174e-40,  6.9060e-41,  2.2264e-40,
-4.1631e-40,  4.5667e-40, -1.8115e-40,
-3.1000e-40,  3.1019e-40,  5.5423e-40,
-5.8518e-40,  2.1290e-40, -5.4579e-40,
-3.7753e-40,  3.6029e-40, -1.7875e-40,
 4.2296e-40,  6.5672e-41,  1.4976e-40,
-3.1479e-40, -3.2881e-40, -5.9818e-40,
 3.2053e-40,  3.0821e-40,  5.1321e-40,
-2.6557e-17, -3.8205e-17, -3.7077e-17,
-2.5168e-17, -3.4817e-17, -3.4186e-17,
-1.8056e-17, -2.3105e-17, -2.2581e-17,
 5.9355e-40,  2.4052e-40, -1.0027e-40,
 2.2060e-40,  3.4864e-40, -5.7403e-40,
 4.6936e-40, -3.3951e-40, -4.7715e-40,
-9.7917e-11, -1.0331e-10, -9.6141e-11,
-1.0581e-10, -1.1173e-10, -1.0317e-10,
-1.0192e-10, -1.0681e-10, -9.8738e-11,
-1.0402e-29, -2.3233e-29, -1.7882e-29,
-1.4804e-29, -3.7821e-29, -3.0750e-29,
-1.0448e-29, -2.6740e-29, -2.1676e-29,
 4.2124e-40,  2.5024e-40,  4.5312e-40,
-2.4880e-40,  2.9838e-41, -2.7215e-41,
-2.6347e-40,  1.5950e-40,  9.3734e-41,
-1.4936e-01, -1.0438e-01,  2.9827e-02,
 1.4751e-02, -1.6854e-01, -8.8101e-02,
 4.9228e-02, -3.0744e-02, -1.1512e-01,
-3.4996e-02, -2.5024e-02, -1.8880e-02,
 3.0008e-02,  4.8689e-02, -1.3415e-01,
-9.1698e-03, -1.1019e-02, -5.0655e-02,
-6.6579e-02, -2.6447e-02,  1.9791e-02,
-4.1727e-02,  3.6433e-02,  3.1516e-02,
-5.7619e-02,  2.3401e-02,  3.0785e-02,
-3.3610e-02,  1.2263e-01,  2.4351e-02,
 1.7148e-02,  1.7144e-01,  4.0305e-02,
 8.7902e-03, -7.0077e-02, -1.0688e-01,
 4.7460e-02, -1.4093e-03, -1.5911e-02,
-2.2978e-02,  9.9025e-02,  1.2867e-02,
 3.4704e-02,  1.4672e-01,  7.9188e-02,
-4.4222e-02, -3.9480e-02, -1.9193e-01,
-3.1897e-02,  1.0776e-01, -5.2742e-02,
 8.0377e-02,  2.5764e-01, -9.7330e-02,
-1.1593e-01, -5.3753e-02, -2.8918e-02,
 6.7939e-02,  2.3963e-01,  2.0856e-01,
 2.7964e-02,  2.7781e-01,  2.1859e-01,
-1.5196e-02,  9.6704e-03, -8.0136e-02,
 8.9441e-02,  1.0314e-01, -2.0204e-02,
-3.3970e-02, -1.4562e-02,  3.4723e-02,
 2.3357e-40, -1.4361e-40,  2.0498e-40,
-5.2355e-40, -6.0151e-40, -2.9264e-40,
 1.9715e-41,  5.9793e-41, -1.3675e-40,
 5.3771e-40,  6.5637e-41, -3.8471e-40,
-3.0820e-40, -1.7004e-40, -1.9371e-40,
-5.1159e-40,  7.3244e-41,  3.5861e-41,
 2.8441e-40,  4.5248e-41,  1.9771e-40,
-2.4681e-40,  3.6054e-40,  3.3496e-40,
-6.5048e-42, -1.6001e-40,  4.8243e-41,
-1.0165e-08, -9.9140e-09, -9.6054e-09,
-1.0511e-08, -1.0256e-08, -9.9066e-09,
-1.0521e-08, -1.0320e-08, -9.9896e-09,
 2.6042e-40,  4.2016e-40,  5.3537e-40,
 1.4594e-40,  1.1344e-40,  3.5144e-40,
-2.5736e-37, -1.3591e-39,  2.1029e-40,
-3.1420e-07, -3.0309e-07, -2.9630e-07,
-3.1196e-07, -2.9967e-07, -2.9249e-07,
-3.1296e-07, -3.0086e-07, -2.9332e-07,
-6.1256e-12, -5.9283e-12, -5.6508e-12,
-6.5297e-12, -6.4118e-12, -6.0667e-12,
-6.8382e-12, -6.8547e-12, -6.5225e-12,
-5.0327e-26, -1.0795e-25, -1.8952e-25,
-2.4220e-26, -5.9067e-26, -1.1323e-25,
-2.1499e-27, -5.5342e-27, -1.0333e-26,
 4.5039e-03, -1.3303e-02,  1.6183e-01,
 6.5951e-02, -7.1353e-02,  1.7254e-01,
-1.8671e-03,  1.0593e-01, -3.6872e-02,
 4.9102e-02, -2.4075e-03,  4.8194e-02,
-7.0892e-02, -1.8948e-01, -1.6586e-01,
-2.8102e-02,  2.0870e-02,  5.9228e-02,
 1.2673e-02,  3.3908e-02,  4.8282e-02,
 4.4369e-02,  5.6304e-02,  1.2225e-02,
 4.1855e-02,  1.1990e-01,  6.3799e-02,
-7.3884e-02,  1.4153e-02,  9.5825e-02,
 4.2850e-02, -3.5337e-02,  1.3615e-01,
-2.0900e-01, -2.2835e-02, -8.6987e-02,
-6.7793e-02,  1.3547e-01, -9.9666e-02,
 3.5498e-02,  5.3725e-02,  1.1501e-01,
-1.2238e-01,  3.5354e-02,  7.4216e-02,
-3.5288e-02,  7.0111e-03,  2.4820e-02,
-1.0649e-02,  1.6715e-01,  1.2825e-01,
 3.1145e-02,  1.2097e-01, -1.2073e-02,
-7.0603e-02,  5.5574e-02, -5.0025e-02,
-8.2885e-02,  1.0957e-01,  1.3311e-01,
 2.9147e-02, -1.1849e-02,  8.9953e-02,
-3.2247e-02, -1.0747e-02,  9.1431e-03,
 1.2114e-01, -5.9780e-02,  5.4821e-02,
-5.2592e-02, -6.9082e-02, -7.5981e-02,
-7.8533e-02,  1.3658e-01,  1.0923e-01,
-3.2530e-02, -2.1342e-01, -1.2200e-01,
-1.9196e-02,  1.0450e-01, -8.9044e-02,
-2.0110e-02,  6.1439e-02, -2.7405e-02,
 6.0823e-02, -6.4268e-03, -9.1778e-03,
 6.4877e-02, -6.1227e-02, -5.4466e-02,
 9.6375e-02,  1.7519e-01,  5.0725e-03,
 1.9159e-01,  3.9725e-01,  1.2851e-01,
-6.9197e-02,  4.9372e-02, -3.4221e-02,
 1.1583e-01,  1.3389e-01,  2.9135e-01,
 1.0290e-02,  1.1214e-01,  1.7560e-01,
-1.8048e-02,  8.4782e-02,  4.9925e-02,
-3.8447e-02, -1.3156e-01, -1.1072e-01,
 1.8256e-01,  2.2831e-01, -1.6508e-01,
 4.6781e-02,  1.4913e-01, -8.6956e-02,
 5.1365e-04,  6.7873e-02, -3.4787e-03,
 1.7689e-01,  1.8414e-01,  2.2286e-01,
 1.2571e-01,  1.7687e-01,  1.5949e-01,
 5.9904e-02,  1.6259e-01,  1.4313e-01,
 2.2234e-01,  4.0943e-01,  3.1469e-01,
 1.9799e-01,  4.3052e-01,  3.0510e-01,
 1.2259e-01, -1.0778e-02,  6.2284e-03,
 1.4508e-02, -6.9073e-02,  5.0998e-02,
 5.2962e-02, -1.5291e-01, -1.0491e-02,
-8.6903e-02, -1.0430e-01,  3.0130e-02,
 4.1691e-02, -1.2675e-01, -5.5169e-01,
 8.9644e-02,  3.6910e-02, -1.5459e-01,
 5.3656e-03,  6.7936e-02,  1.0793e-01,
-2.7424e-02, -1.7652e-01, -3.5776e-01,
 2.4593e-02, -5.6237e-01, -5.9038e-01,
-9.4807e-02, -7.5681e-02, -3.6990e-02,
 8.7385e-03, -5.7989e-02, -4.9573e-02,
-7.7422e-02, -1.1899e-01, -7.4023e-02,
 9.1539e-03, -1.1760e-01,  4.6825e-02,
 1.9901e-02, -3.9718e-02,  1.2997e-02,
 4.2209e-02, -5.2119e-02, -1.2255e-01,
 2.4262e-02,  5.3676e-02, -2.4767e-01,
-4.2933e-02, -2.2473e-01, -4.0310e-01,
-3.5160e-02,  1.9858e-01, -1.5943e-01,
 1.3208e-01, -1.0493e-01, -6.7076e-02,
-2.5244e-01,  1.1175e-02,  2.5568e-01,
-3.3867e-01,  3.1953e-02,  5.9426e-01,
 4.0551e-02,  4.4914e-03, -1.9348e-02,
-6.7386e-02, -1.5543e-01, -3.0883e-02,
 8.9177e-02, -4.6432e-02,  6.8227e-02,
 8.7784e-02,  3.6127e-02, -2.0375e-02,
 4.5461e-02, -4.9071e-02,  9.9435e-02,
-2.5700e-01, -2.7706e-01,  6.2776e-02,
-6.9571e-02, -5.7888e-03,  9.3852e-02,
 2.8490e-02, -2.7854e-01,  1.4209e-01,
 1.5373e-02, -4.3503e-02,  9.6895e-02,
 1.1682e-02,  1.5608e-01,  1.5844e-01,
 5.8027e-02,  2.6632e-02, -8.5479e-03,
 1.2836e-01,  2.0714e-01,  1.0228e-01,
 1.4647e-02,  5.7609e-02, -1.6728e-02,
 2.1212e-01,  3.2673e-01,  4.5670e-02,
-6.0844e-02, -1.1768e-01, -1.1233e-01,
 5.0123e-04,  6.3947e-02, -1.8356e-01,
 1.4091e-01, -2.1568e-02,  8.5933e-02,
-3.9406e-02,  8.2921e-02, -1.0601e-01,
 4.1284e-02, -7.3138e-02,  1.7264e-01,
 2.5883e-02,  5.2945e-01,  2.4510e-01,
 2.7291e-03,  4.0173e-02,  7.8221e-03,
-3.5795e-02, -4.8631e-03, -2.2715e-01,
 1.2330e-01,  7.1739e-01, -4.1725e-01,
 7.5106e-02,  2.5267e-02, -2.8655e-01,
-7.8731e-02, -7.5747e-03, -5.5601e-02,
 7.9764e-02,  1.0524e-01,  8.6742e-03,
 2.1791e-02,  3.7304e-02, -1.1534e-01,
-1.2011e-01, -7.5160e-02,  1.3737e-02,
-2.9470e-01,  2.6613e-01, -2.3740e-02,
 1.2957e-01,  1.4752e-01, -9.3655e-02,
 2.9828e-02,  2.0664e-01,  1.9731e-02,
-8.0378e-02, -3.9481e-01, -1.5395e-01,
-5.7944e-02, -8.6343e-02, -5.4324e-02,
 7.1664e-02,  1.5294e-01, -1.2112e-02,
 2.1023e-02,  1.1945e-01, -7.2998e-02,
-1.1693e-02, -1.8818e-01, -9.8693e-02,
-6.7017e-02,  6.9767e-02, -5.0268e-02,
-9.1106e-03,  2.4267e-01,  6.0277e-02,
 3.5269e-02,  7.7376e-02,  1.6642e-02,
-5.2600e-02, -1.8864e-01, -1.1195e-01,
 3.2119e-01, -9.7913e-02,  1.4734e-01,
 8.6988e-02, -5.3563e-03, -2.6136e-03,
-9.1528e-03,  2.8186e-01, -1.5933e-01,
 4.8499e-02,  4.5189e-01, -1.6399e-01,
 5.8164e-02,  6.3251e-02, -2.8738e-02,
 2.0424e-01, -7.2819e-02,  2.1903e-02,
-3.5630e-01,  1.3171e-01, -7.6749e-02,
 3.8848e-02,  1.7902e-01, -1.1902e-01,
-4.4221e-02,  1.5032e-02,  2.9078e-02,
-1.9738e-01, -1.4878e-02,  1.3315e-02,
 1.3956e-02,  1.2856e-01,  7.0688e-02,
 2.0933e-01,  1.7286e-01,  6.7601e-02,
 5.5136e-01,  4.6866e-01,  1.8402e-01,
 2.2362e-01,  2.4124e-01,  1.3167e-01
}
,)"
R"(
{
-5.2308e-12, -5.4024e-12, -5.0039e-12,
-5.4553e-12, -5.6928e-12, -5.2812e-12,
-5.0230e-12, -5.2150e-12, -4.9133e-12,
 5.7994e-02,  1.0051e-01, -1.0618e-01,
 6.8090e-02,  1.2789e-01,  1.1380e-01,
-1.5882e-01,  8.2323e-03, -9.1424e-02,
 2.0132e-07,  2.0907e-07,  2.1344e-07,
 2.1179e-07,  2.2018e-07,  2.2381e-07,
 2.1095e-07,  2.1920e-07,  2.2150e-07,
 2.9336e-02,  5.4427e-02, -1.2082e-01,
 5.8399e-02,  2.2261e-01,  1.1165e-01,
-9.6098e-02,  8.3175e-02, -6.5909e-02,
 1.2007e-01,  1.9776e-01,  7.7464e-02,
 6.7018e-02,  3.6536e-01,  1.3796e-01,
 6.0724e-02,  4.6161e-02,  2.3740e-01,
-2.1117e-02, -2.0200e-02,  9.3703e-02,
-4.6932e-02, -1.5910e-01,  8.8094e-02,
-5.6641e-02, -1.7146e-01, -1.0502e-01,
-2.5624e-01,  1.6049e-01, -3.3267e-02,
-2.3248e-01,  5.4036e-01,  1.0027e-01,
-2.1680e-01, -7.0096e-03, -1.0692e-01,
-4.8357e-02,  2.5107e-01,  4.8323e-02,
 9.7245e-02,  5.5015e-01, -3.4641e-01,
 1.2458e-02, -1.3626e-01, -4.1992e-01,
-2.1359e-40, -1.4250e-40, -4.7123e-40,
-5.9433e-41,  1.9903e-41, -1.7701e-40,
-5.9941e-40, -5.8562e-40, -5.0226e-40,
-2.6581e-40,  1.3006e-40, -1.4201e-40,
 5.4264e-40,  2.3848e-40,  5.6412e-40,
-2.6378e-41, -5.7132e-40, -4.1343e-40,
-3.2848e-22, -3.6697e-22, -3.4147e-22,
-3.5780e-22, -3.9435e-22, -3.5989e-22,
-3.1212e-22, -3.4305e-22, -3.0670e-22,
-1.1749e-08, -1.1602e-08, -1.1494e-08,
-1.2125e-08, -1.1918e-08, -1.1718e-08,
-1.1779e-08, -1.1623e-08, -1.1559e-08,
-5.0237e-07, -4.9179e-07, -4.6744e-07,
-5.1967e-07, -5.0826e-07, -4.8421e-07,
-5.0226e-07, -4.9668e-07, -4.8019e-07,
 5.6433e-41, -3.0514e-40, -5.4526e-40,
 1.1125e-41,  2.9485e-40,  5.5282e-40,
 3.0229e-40,  1.5915e-40,  5.3759e-40,
-6.1144e-27, -9.2380e-26, -2.4302e-25,
-9.3834e-25, -1.0289e-23, -1.9513e-23,
-4.3746e-24, -4.4359e-23, -7.0505e-23,
-8.1604e-36, -3.2928e-37, -2.2994e-40,
-3.9543e-37, -9.9513e-39,  7.4616e-41,
-4.0044e-39,  4.4392e-40,  4.8856e-40,
-3.3447e-40, -3.9935e-40,  2.4649e-40,
 2.0207e-40, -3.0245e-40, -7.1986e-41,
 6.2938e-40, -3.6922e-40,  1.5296e-40,
-6.4982e-41,  5.0849e-41,  5.7873e-40,
 1.4327e-40, -4.2163e-40,  1.3807e-40,
 2.8569e-40,  1.9139e-40,  3.2985e-40,
-5.4410e-40,  2.3070e-40,  2.1690e-40,
-1.5964e-40, -2.2781e-40,  5.6766e-40,
 2.2533e-42, -2.5532e-40, -5.5822e-40,
 5.7249e-40,  5.3555e-40, -4.9107e-41,
 1.7538e-40, -1.2312e-40,  5.0077e-40,
 6.1500e-40,  1.9980e-40,  6.2953e-40,
-7.5314e-23, -9.4299e-23, -7.1342e-23,
-8.5139e-23, -1.1237e-22, -9.0478e-23,
-6.2038e-23, -8.5180e-23, -7.3015e-23,
 5.0613e-40,  1.5224e-40, -1.8977e-40,
 2.4108e-41, -5.1771e-40,  6.2317e-40,
 1.0465e-40,  2.8816e-41,  6.2500e-40,
 3.5727e-40,  4.2717e-40, -3.5900e-40,
-4.4831e-40,  3.4260e-40, -4.8293e-40,
-2.4133e-40,  3.1140e-40, -2.0777e-40,
-2.2906e-41,  3.5923e-40, -4.4443e-40,
-4.6615e-40, -2.1123e-40,  4.5700e-40,
-4.6360e-40, -3.6052e-40, -3.4319e-40,
-3.6575e-40, -3.5707e-40, -3.0530e-41,
 4.2531e-40, -1.2255e-40, -3.9607e-40,
 3.5903e-40, -5.4630e-40, -3.1460e-40,
 2.8820e-40,  4.9460e-40,  6.1461e-40,
 8.9118e-41, -4.6579e-40, -2.4172e-40,
-5.5474e-40, -8.1848e-41, -1.6910e-40,
-1.6272e-25, -1.8802e-25, -1.7229e-25,
-1.7850e-25, -2.0338e-25, -1.8235e-25,
-1.4715e-25, -1.6733e-25, -1.4681e-25,
-5.5471e-09, -5.6862e-09, -5.7043e-09,
-5.8727e-09, -5.9823e-09, -5.8983e-09,
-5.8040e-09, -5.8670e-09, -5.7388e-09,
-9.7253e-07, -9.7248e-07, -9.4623e-07,
-1.0149e-06, -1.0042e-06, -9.6709e-07,
-1.0139e-06, -9.9930e-07, -9.5295e-07,
-4.5042e-40,  2.6725e-40,  2.3181e-40,
-4.6274e-41, -1.1799e-40,  5.0685e-40,
-1.0765e-40,  3.3322e-40, -6.1905e-40,
-1.3653e-34, -3.4690e-33, -1.1578e-32,
-1.4444e-31, -2.1995e-30, -4.8668e-30,
-1.2965e-30, -2.0189e-29, -3.3962e-29,
-2.5057e-40,  7.2876e-41,  4.5731e-41,
-1.6525e-40,  5.0987e-40, -5.4683e-40,
 8.1836e-41,  6.2722e-40, -3.1057e-40,
 4.0987e-40,  3.5941e-40,  5.1680e-40,
 5.5563e-40,  3.1011e-40,  4.7068e-40,
 1.0426e-40, -1.0803e-40,  4.4867e-40,
-4.9675e-03,  1.5412e-01, -4.1930e-03,
-6.1089e-02,  2.0405e-01,  1.9587e-01,
 3.8772e-02,  1.6894e-01, -2.6163e-02,
 1.0839e-30,  1.8608e-30,  1.1386e-30,
 1.4863e-29,  1.9422e-29,  1.1639e-29,
 1.7504e-29,  2.2177e-29,  1.3629e-29,
 6.4484e-02,  6.6296e-02,  2.2838e-01,
-1.0213e-01,  7.5883e-02, -1.7531e-01,
-1.4869e-01,  1.0736e-01,  1.4129e-01,
-2.8235e-02, -2.9232e-02, -9.3912e-02,
 5.1317e-02,  9.0256e-02, -2.4669e-02,
-3.2465e-02,  5.8099e-02,  9.8402e-02,
-2.3135e-01, -1.3786e-01,  2.8581e-01,
-3.2410e-01, -2.6623e-01,  6.1583e-02,
 1.8696e-01,  4.7251e-02, -2.3520e-01,
 2.5630e-02, -1.2358e-01, -1.5735e-01,
-1.2198e-01,  5.1970e-01,  1.9976e-01,
-1.2515e-01,  9.8768e-02,  5.8917e-02,
-3.8569e-02, -9.2729e-02, -1.8982e-01,
 1.1378e-01,  5.7195e-01, -1.8265e-01,
-3.5724e-02, -2.1379e-01, -2.2129e-01,
-5.1198e-40, -3.4709e-40,  6.2940e-40,
-2.2134e-41, -3.6133e-40, -2.7075e-40,
-5.9664e-40, -2.3937e-40,  3.0876e-40,
 9.1814e-41,  9.5898e-41, -3.1892e-40,
 3.1093e-40,  2.7935e-40,  1.7966e-40,
-2.3967e-40,  4.0806e-40,  6.2012e-40,
 5.3771e-41,  6.1000e-40, -4.6695e-40,
 5.9474e-41, -4.9675e-40,  5.7403e-41,
 4.7091e-40, -5.0751e-41,  3.9864e-41,
-9.7756e-41,  2.7978e-40, -5.0791e-40,
-3.4321e-40, -7.0774e-41, -5.2651e-40,
 2.8034e-40, -3.3452e-40,  1.9535e-40,
-6.2300e-40, -1.8372e-40, -1.9038e-40,
-5.6564e-40, -6.1257e-40, -1.0338e-40,
-1.7191e-41, -1.2843e-41,  5.0707e-40,
-4.4587e-40,  2.7128e-40, -1.4155e-40,
-5.7475e-40, -3.4612e-40, -4.7424e-40,
 1.7235e-40, -6.0028e-40, -1.6342e-40,
-5.1072e-40, -2.4721e-40, -2.8477e-41,
 2.6598e-40, -4.4078e-40,  4.1763e-40,
-3.3947e-40, -5.5626e-40,  4.9713e-40,
 2.1733e-40, -2.9024e-40, -4.5514e-42,
-3.4873e-40, -1.0737e-40, -1.4297e-40,
 2.8514e-40,  2.6283e-40,  2.2827e-40,
 3.8908e-40, -4.2140e-40,  6.1433e-40,
-4.7825e-40, -3.0140e-40, -5.9563e-40,
 1.5280e-40,  2.6156e-40,  5.0361e-40,
 1.9497e-01,  2.3140e-01, -3.5244e-02,
 1.6876e-01, -1.7646e-02, -2.0413e-01,
 9.8052e-02, -6.7906e-02, -3.9834e-02,
-5.9252e-15, -6.7431e-15, -8.1865e-15,
-5.7350e-15, -6.6893e-15, -8.9833e-15,
-8.4106e-15, -1.0631e-14, -1.5948e-14,
 8.9389e-02,  6.6460e-02,  6.8477e-02,
 6.1099e-03, -8.7536e-02,  1.1792e-01,
-1.0079e-01,  1.5293e-01,  4.3945e-02,
 1.0168e-01,  1.0281e-01, -7.9173e-02,
 2.0855e-01,  1.7537e-01, -7.1000e-02,
-1.4157e-01, -3.8478e-02, -2.7478e-01,
 2.2156e-01, -6.4262e-02, -7.2841e-02,
-3.2334e-01,  6.5591e-02,  1.1163e-01,
 7.2151e-02, -1.6943e-01,  5.9049e-02,
-1.4813e-01, -2.0904e-01, -8.8010e-02,
-2.7215e-01,  5.7668e-01,  1.7618e-02,
-7.1365e-02,  1.2976e-01, -1.0169e-01,
-8.9229e-02,  3.3971e-02,  1.8295e-01,
 1.7204e-01,  3.8082e-01,  3.7415e-02,
 5.9309e-02, -4.9550e-04,  5.1555e-01,
-5.1006e-18, -5.6038e-18, -5.8724e-18,
-5.8910e-18, -5.8379e-18, -5.6311e-18,
-5.2596e-18, -5.1835e-18, -4.6300e-18,
 6.4067e-02,  1.8889e-02, -1.0634e-01,
 1.7316e-04,  1.9935e-01, -1.1854e-02,
-9.3669e-02, -1.1924e-01, -1.8981e-02,
 1.7465e-08,  1.7340e-08,  1.7565e-08,
 1.8234e-08,  1.8008e-08,  1.8017e-08,
 1.9226e-08,  1.8956e-08,  1.8651e-08,
-1.7294e-01, -1.2200e-01, -4.9577e-02,
-3.5087e-02, -1.2526e-01,  9.3445e-03,
-7.4374e-02, -1.1350e-01,  2.7510e-03,
 8.5153e-02,  4.2080e-02, -5.0111e-02,
 1.2845e-01,  1.9630e-01,  1.0542e-01,
-1.0095e-01,  6.2631e-02,  8.8734e-02,
 3.4836e-01,  5.4389e-01, -2.2360e-01,
 5.1721e-01,  5.7094e-01, -6.7491e-02,
-3.5972e-02,  1.0590e-01, -2.2984e-01,
-1.5483e-01, -5.1271e-03,  4.9780e-02,
-1.3184e-01,  2.8028e-01, -1.1427e-02,
-3.4093e-02, -6.7622e-02, -1.2359e-02,
 1.3184e-02,  1.2125e-01, -1.2502e-02,
 9.2730e-02, -6.5974e-02, -1.6519e-01,
 1.9546e-01, -1.5188e-01, -8.1752e-02
}
,)"
R"(
{
-3.4905e-04, -3.5739e-04, -3.2920e-04,
-3.8506e-04, -3.9121e-04, -3.5635e-04,
-3.7303e-04, -3.7698e-04, -3.4190e-04,
 2.8622e-41, -1.2033e-41,  1.2609e-40,
-4.9379e-40, -5.1047e-40,  5.5085e-41,
-4.7002e-40, -5.0136e-40, -4.5629e-40,
-5.1095e-40,  1.8741e-40,  1.8435e-40,
 4.1851e-40, -8.9558e-41, -9.6681e-41,
-1.8244e-40,  2.7992e-40,  1.8116e-40,
 2.8655e-40, -3.0193e-40,  2.2293e-40,
 1.6805e-40,  3.3049e-40,  6.9542e-41,
-3.3329e-40,  4.2212e-40, -1.3453e-40,
-8.4502e-15, -1.1099e-14, -9.4174e-15,
-9.8778e-15, -1.1768e-14, -9.4875e-15,
-6.7805e-15, -7.4561e-15, -5.8023e-15,
 6.0452e-40,  6.9262e-41,  2.9300e-40,
-6.1511e-40, -4.1269e-40,  4.4012e-40,
 1.3340e-42, -2.9020e-40, -4.5529e-40,
-1.2289e-22, -1.3972e-21, -5.5694e-21,
-1.7854e-21, -1.7743e-20, -5.6749e-20,
-6.8510e-21, -6.2353e-20, -1.6203e-19,
-5.0003e-07, -5.1950e-07, -4.7654e-07,
-5.5510e-07, -5.7995e-07, -5.2753e-07,
-5.3262e-07, -5.5802e-07, -5.0971e-07,
-1.4922e-02, -1.1926e-01, -1.9067e-02,
-2.6298e-03,  2.1756e-01,  3.0148e-02,
 1.4372e-01,  3.5066e-02, -1.0184e-02,
-4.1698e-12, -4.8798e-12, -6.4033e-12,
-2.3169e-12, -2.7879e-12, -3.7276e-12,
-1.6177e-12, -2.0021e-12, -2.6440e-12,
-5.9514e-40, -4.4339e-40, -3.0315e-40,
 3.5756e-40,  2.5390e-40, -1.2253e-40,
 2.1417e-40,  4.0569e-40,  5.3962e-40,
-5.5825e-13, -6.8528e-13, -9.3486e-13,
-2.9163e-13, -3.6959e-13, -5.1183e-13,
-1.8703e-13, -2.4740e-13, -3.4019e-13,
-2.7137e-01, -4.5025e-01,  2.6405e-02,
-7.9580e-02,  5.0698e-01, -7.8794e-02,
-3.7540e-02, -7.1115e-03, -3.9741e-01,
-5.9910e-40, -5.5101e-40,  3.1274e-41,
-6.9384e-41, -4.9294e-40, -1.0818e-40,
-3.5484e-40, -4.7965e-41, -5.2508e-41,
 4.1917e-01, -1.6207e-02, -6.8506e-02,
-2.7060e-02,  5.6162e-01,  1.6696e-01,
-1.7677e-03,  1.8842e-01, -6.0493e-02,
-3.0696e-01, -1.7293e-01, -8.7143e-02,
-1.6740e-01,  1.8861e-02, -1.7112e-01,
 8.6594e-02,  3.0025e-01, -7.6141e-02,
 1.1317e-02,  1.0678e-01, -5.1283e-02,
-1.2872e-01,  4.2580e-01,  4.9678e-02,
-2.8372e-01, -1.3479e-01, -7.3813e-02,
-1.7038e-15, -1.1156e-15, -7.3385e-16,
-2.6350e-15, -1.6234e-15, -1.0598e-15,
-7.7860e-15, -4.6981e-15, -3.0030e-15,
-3.0246e-40, -4.1596e-40,  2.9013e-40,
 8.5195e-41, -2.2396e-40, -2.0322e-40,
-5.6200e-40,  2.4820e-40,  3.1309e-40,
-3.1822e-17, -1.6585e-17, -8.8616e-18,
-5.9907e-17, -2.9812e-17, -1.6126e-17,
-2.4410e-16, -1.2541e-16, -6.7867e-17,
 1.5795e-01, -1.4429e-01, -6.0501e-02,
 5.9113e-02,  3.4391e-01,  1.4165e-01,
 5.2564e-02, -1.8209e-01, -6.8176e-02,
-7.7363e-41,  5.9969e-40,  5.9290e-40,
-7.4888e-41, -7.0945e-41,  5.3120e-40,
 1.3612e-40, -4.6718e-40, -1.0677e-40,
-1.1498e-01, -1.2925e-02,  2.6735e-02,
-8.1469e-02,  2.9678e-01,  1.8971e-01,
 2.0149e-02,  2.4207e-03, -1.2549e-01,
-6.6799e-02, -3.5900e-02, -5.6111e-02,
 9.5181e-02,  2.1216e-02,  2.0477e-01,
 8.5923e-03,  6.8615e-03,  3.8252e-02,
 4.5098e-03,  2.1321e-01,  3.4612e-03,
 3.5662e-01,  4.7532e-02,  2.5319e-01,
 4.1275e-02,  1.7951e-01,  3.2239e-02,
-2.6628e-21, -7.7165e-22, -4.9086e-22,
-1.4320e-21, -2.7134e-22, -1.2712e-22,
-1.9648e-21, -3.4172e-22, -1.3895e-22,
-2.2836e-40,  3.2091e-40, -4.4396e-40,
 2.9048e-40,  6.0866e-40,  3.7804e-40,
-3.0676e-40, -2.4897e-40,  4.9891e-40,
-1.8955e-28, -3.4994e-29, -1.2914e-29,
-4.7737e-29, -3.5212e-30, -6.4003e-31,
-8.2908e-29, -3.1692e-30, -3.6909e-31,
-9.3327e-02,  1.5314e-01,  1.0676e-01,
 2.5979e-01, -6.6826e-01,  2.3727e-01,
 1.4855e-01,  1.9205e-01,  8.8246e-02,
-5.5197e-40,  5.3162e-41, -5.2933e-40,
 1.0846e-41, -5.8128e-40, -3.1273e-40,
-2.8408e-40,  1.6989e-40,  4.8221e-41,
 7.8403e-02,  1.6407e-01,  7.9932e-02,
 3.2253e-01, -2.6036e-01, -8.9727e-02,
-7.5145e-02,  1.5536e-02, -8.2710e-02,
-2.1608e-01, -4.4619e-01, -4.4470e-02,
-3.9430e-01, -8.2373e-01, -7.0646e-01,
-6.9004e-03, -4.9697e-01, -1.4212e-01,
-1.8932e-06, -1.8356e-06, -1.6373e-06,
-1.9427e-06, -1.9113e-06, -1.7028e-06,
-1.8843e-06, -1.8616e-06, -1.6818e-06,
-4.7452e-29, -4.4894e-29, -2.5364e-29,
-5.6268e-29, -5.4363e-29, -3.0876e-29,
-4.3808e-29, -4.2767e-29, -2.4573e-29,
 3.8855e-40,  3.5152e-40, -4.8707e-40,
 4.3606e-41, -1.7886e-40,  5.1970e-40,
 6.2864e-40,  5.9972e-40,  2.2197e-40,
-2.1903e-37, -1.9174e-37, -7.0785e-38,
-2.7149e-37, -2.4810e-37, -9.5619e-38,
-1.8463e-37, -1.7136e-37, -6.7163e-38,
-2.9062e-30, -3.1324e-30, -1.0876e-30,
-2.7434e-30, -3.7036e-30, -1.2821e-30,
-6.8828e-31, -9.8708e-31, -3.7930e-31,
-6.3329e-41, -3.8604e-41, -2.8272e-40,
-3.3350e-40, -1.5210e-40, -4.2620e-41,
-1.7669e-41,  5.2291e-40, -3.3205e-40,
-3.0738e-25, -8.2305e-24, -2.1451e-23,
-1.4470e-24, -4.5131e-23, -1.2177e-22,
-4.2841e-24, -1.3077e-22, -3.5946e-22,
-8.5637e-08, -8.4715e-08, -7.7597e-08,
-8.7326e-08, -8.7480e-08, -8.0290e-08,
-8.4525e-08, -8.4963e-08, -7.8582e-08,
-5.8581e-27, -8.8483e-27, -8.1150e-27,
-7.4336e-27, -1.2036e-26, -1.1909e-26,
-6.6006e-27, -1.0685e-26, -1.0809e-26,
-5.6355e-40, -2.3469e-40, -3.5885e-40,
-2.0755e-40,  2.0377e-40,  3.2259e-40,
-5.3947e-40,  4.2747e-41,  4.8967e-41,
 4.5073e-41,  5.0069e-40,  2.6114e-40,
-4.8225e-40, -4.8317e-40, -5.4316e-40,
-5.4335e-40, -5.2994e-40,  2.6295e-40,
-1.1702e-40, -2.3137e-41, -4.5405e-40,
-4.6797e-40,  6.5582e-41,  1.8111e-40,
 6.1477e-40, -1.6827e-40, -2.0288e-40,
-2.4220e-41,  4.7774e-40,  5.1050e-40,
 4.9844e-40,  5.6437e-41,  4.7749e-40,
-6.8037e-41, -5.5944e-41, -5.2248e-40,
-2.9382e-40,  2.3800e-41,  1.5850e-40,
-4.5290e-40, -5.2260e-41,  2.3726e-40,
-1.9232e-40, -2.3502e-40, -2.9736e-40,
-2.8081e-40, -5.2929e-40, -4.0786e-40,
-3.0303e-41,  3.1336e-40, -5.8450e-40,
-1.5091e-40, -2.7371e-40, -4.5927e-40,
-4.0985e-38, -6.9102e-38, -5.4450e-38,
-6.2744e-38, -1.1526e-37, -9.9374e-38,
-4.8587e-38, -9.1819e-38, -8.0593e-38,
-2.9266e-29, -4.5005e-29, -3.9891e-29,
-3.8505e-29, -6.3370e-29, -6.0017e-29,
-3.2761e-29, -5.4145e-29, -5.1812e-29,
 3.3692e-40,  1.0044e-40, -6.6821e-41,
 9.2910e-41,  6.2137e-40, -3.5625e-40,
 1.8601e-40,  3.1653e-40, -1.1506e-40,
 1.2093e-40, -5.7191e-40,  5.6828e-40,
-2.3177e-40, -2.1648e-40,  5.3642e-40,
 4.8826e-40,  5.2760e-40, -4.9059e-40,
-2.0721e-40,  2.0122e-40, -5.9485e-40,
 3.8843e-40, -6.0861e-41, -4.0542e-40,
-3.4308e-40, -4.2822e-40, -3.9605e-40,
-5.7429e-40,  4.9242e-40, -5.9141e-40,
 4.6267e-40, -2.4953e-40, -2.9300e-40,
 5.3466e-40, -5.2403e-40,  3.5178e-40,
-1.8309e-40,  2.9157e-40, -7.7367e-41,
-5.8922e-40,  3.2359e-40, -6.1293e-40,
 6.1138e-40,  2.2121e-40, -5.0657e-42,
 4.7910e-40, -1.4080e-40,  1.9220e-40,
-3.5670e-40,  3.4204e-40, -5.0215e-40,
 1.1877e-41,  2.3114e-40, -4.7794e-40,
-3.6520e-40,  4.3222e-40, -5.2866e-40,
-6.0703e-40, -4.0896e-40, -1.2521e-40,
-4.1981e-40,  5.4404e-41,  3.3337e-40,
 1.3733e-01,  1.8485e-01,  7.6179e-02,
 8.1719e-02,  3.3343e-01,  2.9857e-02,
-4.2753e-03,  2.0957e-01,  1.8582e-02,
 2.9948e-07,  3.3403e-07,  3.7619e-07,
 3.4854e-07,  3.8224e-07,  4.1507e-07,
 3.7511e-07,  4.0398e-07,  4.3743e-07,
-1.7150e-41, -2.4088e-41, -1.5593e-40,
 6.3817e-41,  4.8004e-41, -1.1053e-40,
-2.5225e-40, -2.7111e-40, -4.2970e-40,
 1.0496e-06,  1.0916e-06,  1.1376e-06,
 1.1364e-06,  1.1756e-06,  1.2051e-06,
 1.1762e-06,  1.2105e-06,  1.2358e-06,
 1.0037e-02,  1.4957e-01, -4.9010e-02,
 2.6877e-02,  1.9067e-01, -1.9339e-03,
-2.2081e-02, -1.5137e-01, -1.6088e-01,
 1.6880e-41, -2.0352e-41, -4.1857e-42,
 2.0926e-40, -2.1394e-41, -5.4341e-40,
 4.6824e-40,  6.2682e-40,  4.9865e-40,
-3.2967e-01, -2.5981e-01, -1.3016e-01,
-2.6507e-01,  3.2282e-01,  4.3204e-01,
-7.0936e-02,  1.9800e-01,  9.4916e-02,
-1.0122e-02,  7.4127e-02, -7.1554e-02,
 7.7869e-02,  1.5734e-01,  1.3287e-01,
-9.5431e-02,  1.0984e-01, -7.6759e-02
}
,)"
R"(
{
-5.5262e-40,  3.7699e-40, -1.4920e-40,
 4.0064e-40, -2.0632e-40, -4.4801e-41,
-3.6749e-40,  5.9043e-40, -1.5942e-40,
-5.9219e-42, -4.1286e-40, -1.6920e-40,
-2.5927e-40, -4.5458e-41,  2.0990e-40,
-4.6860e-40,  5.0483e-40,  2.8004e-40,
-4.0641e-40,  6.0770e-40, -3.8297e-42,
 5.7537e-40,  5.7772e-40, -1.0048e-40,
 1.5945e-40,  3.9582e-40, -2.6190e-40,
-5.1046e-40, -5.5028e-40,  5.8786e-40,
-3.5033e-40, -1.2031e-40, -3.4156e-40,
 3.0058e-40,  4.3043e-40,  5.9825e-40,
 4.9197e-40,  2.5974e-40, -4.3461e-41,
-4.1935e-40, -1.6383e-41, -1.4680e-40,
-5.3501e-40, -2.6348e-40,  3.0631e-40,
-5.2019e-40, -4.4123e-40,  2.3984e-40,
-4.4682e-41, -4.6000e-40, -5.0418e-40,
-4.1263e-40,  4.5391e-40,  2.8844e-40,
 5.2179e-40, -1.3188e-40,  5.1600e-40,
-2.2913e-40, -3.1127e-40,  5.4478e-40,
 2.3395e-41,  5.4758e-40,  2.0998e-40,
-1.9914e-10, -2.0700e-10, -1.9815e-10,
-2.1098e-10, -2.1989e-10, -2.1131e-10,
-2.0797e-10, -2.1693e-10, -2.0860e-10,
-2.1061e-40, -2.1208e-40, -3.3698e-40,
 3.2370e-40,  2.9276e-40, -3.6860e-40,
 3.4752e-40, -2.0660e-40, -3.8183e-40,
-8.0136e-02,  1.3809e-02,  1.6846e-03,
 3.7960e-02,  8.7557e-02, -3.5498e-01,
 9.8165e-03,  9.8384e-02,  1.2395e-01,
-2.8751e-02,  9.9172e-02,  5.5841e-02,
-4.0383e-02,  1.0856e-01, -5.4339e-01,
 1.3245e-02, -4.7642e-02, -1.0427e-01,
-7.4696e-03,  5.0806e-02, -1.7179e-01,
 5.0303e-02, -4.0322e-01,  7.4760e-01,
-9.2342e-02,  1.1958e-01, -1.8871e-01,
 3.7044e-40, -4.6951e-40, -1.9873e-40,
 5.3289e-41,  2.7689e-40, -4.6994e-41,
-3.1404e-40, -5.9106e-40,  6.0436e-40,
-6.0294e-40, -3.6565e-40, -1.1884e-40,
 5.5933e-40, -9.5741e-41,  4.4736e-40,
 4.3267e-40, -4.9583e-40,  3.4437e-40,
-1.7432e-40,  1.4518e-40,  2.1033e-40,
-3.4667e-40,  1.7222e-40, -2.5651e-40,
-5.2517e-40,  2.8983e-41, -1.3832e-40,
-1.4153e-01,  9.4023e-02, -9.8526e-02,
 2.0678e-01,  4.0842e-01, -1.1853e-01,
-1.4108e-01, -1.1005e-01, -8.1274e-02,
 3.4336e-41,  1.5625e-40,  2.7213e-40,
-5.3447e-40, -3.7330e-40, -3.3637e-40,
-4.3563e-40, -3.7094e-40,  1.2820e-41,
-8.1700e-02, -1.8215e-01, -1.6011e-01,
-1.4203e-01,  5.3791e-02, -3.7663e-02,
-1.1705e-01, -1.2604e-01, -8.4890e-03,
-6.1578e-02, -3.3907e-01,  2.2344e-03,
 1.5060e-01, -1.9199e-01, -5.5274e-02,
 6.2300e-02,  9.1084e-02,  1.3788e-02,
 4.9025e-02,  3.3738e-01, -1.8104e-01,
-2.5051e-01,  8.2363e-02,  2.0325e-01,
 5.6988e-02, -1.5118e-01,  6.8897e-02,
-4.6233e-40,  1.2244e-40, -3.9802e-40,
 5.8530e-40, -2.4162e-40,  4.6793e-40,
-4.8362e-40,  3.3071e-40,  1.7094e-40,
 3.5249e-40, -4.8579e-40,  1.9374e-40,
 6.2372e-42,  5.8402e-41,  3.2851e-40,
 6.1488e-40,  1.8086e-40, -5.2451e-40,
-3.0723e-40, -5.6704e-40, -5.9899e-40,
-3.5975e-40, -1.3818e-40, -2.7285e-40,
 2.4468e-40,  8.3606e-41,  1.8818e-40,
-2.3749e-01, -2.7008e-01, -1.5222e-03,
 1.4806e-01,  9.0783e-02,  2.7170e-02,
 1.8706e-01,  1.8162e-01, -1.1799e-01,
-1.9852e-40, -4.8879e-40, -3.1971e-40,
-1.0245e-40,  9.1421e-41,  5.3018e-40,
 2.2240e-40, -1.4666e-40, -4.4259e-40,
 1.1835e-01, -2.7624e-01,  1.1446e-01,
 1.3574e-01,  4.3109e-01,  1.3227e-01,
 3.2554e-02,  1.7139e-01, -1.1988e-01,
 3.5376e-02,  8.9191e-02,  6.7643e-02,
-8.2716e-02,  2.4178e-01,  6.0818e-02,
-6.7722e-02, -3.3712e-02,  3.0664e-02,
-6.6948e-02,  2.2886e-01,  1.8143e-01,
 1.8636e-01, -2.4800e-01,  1.7185e-01,
-6.5479e-03,  1.8828e-01, -7.4464e-02,
-2.8281e-30, -5.8969e-31, -2.3180e-31,
-1.6163e-30, -3.8426e-31, -1.6788e-31,
-1.9412e-30, -4.1995e-31, -1.7651e-31,
-2.0525e-40,  4.6680e-40,  5.9108e-41,
 1.0336e-40, -5.7226e-41, -6.1906e-40,
-1.8693e-40,  5.5777e-40,  6.0898e-40,
-3.4735e-41, -3.2674e-40, -2.3864e-41,
-3.3596e-40,  3.3107e-40,  1.0843e-40,
 5.1103e-40,  6.0598e-40, -3.6267e-40,
-4.5583e-03, -1.0635e-01, -7.4962e-02,
-1.2741e-01,  2.7234e-01,  1.0508e-01,
-2.1207e-01,  9.6720e-02,  3.4641e-02,
 1.1304e-12,  1.1614e-12,  9.7086e-13,
 1.3361e-12,  1.3697e-12,  1.1286e-12,
 1.2620e-12,  1.2938e-12,  1.0680e-12,
-8.4197e-02,  6.3834e-02,  2.3157e-02,
-2.1280e-02,  2.9074e-01,  8.5883e-02,
-1.3695e-01, -1.6047e-01, -4.5834e-02,
-1.3848e-01, -6.6090e-02, -7.7201e-02,
-5.1963e-02,  6.0643e-02, -4.9932e-02,
 1.1779e-01,  1.7521e-01,  3.0366e-02,
 4.7601e-03,  4.3941e-02, -3.5985e-02,
 1.7692e-02, -2.3705e-01,  2.1062e-01,
 7.7174e-02, -7.6616e-02,  2.0102e-02,
-3.6353e-06, -3.5534e-06, -3.2461e-06,
-3.6813e-06, -3.6196e-06, -3.3222e-06,
-3.5581e-06, -3.5179e-06, -3.2504e-06,
-7.3892e-11, -7.2930e-11, -6.8104e-11,
-7.9244e-11, -7.7770e-11, -7.2319e-11,
-7.7297e-11, -7.5673e-11, -7.0195e-11,
-1.5180e-10, -1.5027e-10, -1.4244e-10,
-1.6013e-10, -1.5761e-10, -1.4940e-10,
-1.5682e-10, -1.5395e-10, -1.4553e-10,
-9.1167e-02,  1.2374e-01, -3.8304e-02,
 2.2641e-01,  2.4855e-01, -4.3174e-02,
 1.4364e-01,  1.8438e-01,  1.1617e-02,
 6.1925e-40,  3.3333e-40,  1.8962e-40,
 3.2481e-40, -1.7566e-40, -3.0456e-40,
 2.7654e-40,  3.8422e-41,  4.9191e-40,
 7.5657e-02, -1.0697e-03,  3.0319e-02,
-4.7642e-02, -9.4454e-02, -2.6543e-02,
-5.3129e-02, -1.9667e-01, -1.0851e-01,
-8.5909e-03,  1.2177e-01,  2.6434e-01,
 2.4468e-02,  5.0484e-02,  3.4698e-01,
-1.4764e-03,  3.7374e-02,  1.2658e-01,
 2.0602e-02, -2.4624e-02,  1.3741e-01,
 1.8641e-02,  4.0484e-01,  3.2976e-01,
-4.4809e-01, -3.2104e-03,  1.6290e-03,
 8.1306e-41,  2.0311e-40,  2.9683e-40,
-5.7636e-40,  4.4291e-40,  4.3356e-40,
-7.1797e-41,  4.5366e-40,  3.9953e-40,
-4.5418e-40,  4.1805e-40, -3.2458e-41,
-9.4881e-41, -8.6365e-41, -1.9294e-40,
 7.1954e-41, -9.8565e-41, -5.5540e-40,
-5.3769e-40,  1.4094e-40, -1.5355e-40,
 8.8038e-41, -3.6848e-40, -1.2237e-40,
-2.8267e-41, -1.7583e-40, -5.9647e-40,
 1.0929e-01,  2.9895e-02, -1.4923e-01,
-1.1234e-01, -1.0514e-01, -1.3280e-02,
 2.2255e-01,  6.4152e-03, -1.6309e-02,
-1.5899e-40, -7.2549e-41, -2.6734e-40,
-3.3842e-40,  3.3255e-40,  4.2694e-40,
 5.2940e-40,  3.2455e-40, -3.7081e-40,
 6.3639e-02, -3.3720e-02, -2.3453e-02,
 1.9477e-01,  5.2267e-02,  1.8565e-02,
 1.6048e-01,  2.7636e-01,  1.5930e-02,
 1.7673e-03,  6.3646e-02, -1.5127e-02,
-3.7787e-02, -1.4037e-01, -3.6231e-02,
-1.5636e-02, -7.8742e-02, -2.4137e-02,
-5.0748e-02,  6.5641e-02, -2.5353e-03,
 8.4955e-02,  7.4231e-01,  1.3795e-01,
-1.4552e-01,  2.0869e-01,  4.0739e-02,
-2.0015e-41,  5.2988e-40,  2.7578e-40,
 4.1051e-40,  1.2834e-40, -3.4898e-40,
-1.1975e-40,  4.2374e-40, -3.0404e-41,
-6.3014e-40,  4.6330e-40, -4.4141e-41,
 2.5442e-41,  5.7456e-40,  2.3848e-40,
-1.0788e-40, -5.0563e-40, -5.3638e-41,
 3.5728e-40,  1.9752e-40,  6.1004e-40,
 2.8189e-41, -6.2151e-40,  1.1807e-41,
 6.5305e-41,  5.2028e-40,  1.3692e-40,
 6.4391e-02, -1.3079e-01, -3.7980e-02,
-3.2362e-01, -3.7239e-01, -8.0182e-02,
-2.6787e-01, -3.1240e-01, -1.2798e-02,
-1.2072e-40,  5.3996e-40, -3.4352e-40,
-8.0996e-41, -3.0208e-40,  3.1848e-40,
-5.6407e-40,  2.4674e-41, -2.1055e-40,
-9.2897e-02,  1.8040e-01, -4.3269e-01,
-7.6669e-02,  4.3554e-01, -4.4870e-02,
-2.3249e-02, -1.1805e-01,  1.0507e-01,
-5.2540e-02, -3.6856e-01,  1.1246e-01,
-2.3632e-02,  1.3165e-01, -1.5380e-02,
-1.1467e-02, -5.3754e-02, -4.1619e-02,
-1.5635e-01,  3.8584e-01, -1.4434e-01,
 1.7523e-01,  3.7253e-02,  4.9784e-01,
 5.8484e-02, -8.4711e-02, -7.7498e-02,
-1.6956e-40,  5.4293e-41, -2.5140e-40,
-3.1995e-40, -4.8337e-40,  2.5539e-40,
-1.1449e-40,  1.9503e-40, -1.7368e-40,
 5.4753e-40,  5.9720e-40, -4.7821e-40,
 3.8830e-40, -3.1984e-40, -2.7163e-40,
-5.3411e-40,  7.2638e-41,  4.3186e-40,
 4.6654e-40, -5.9540e-40, -2.8155e-40,
-1.4801e-40, -1.6945e-40,  1.9723e-40,
 5.8380e-40, -6.1587e-40,  3.3667e-40,
-2.9327e-02, -4.2746e-02, -1.5018e-01,
 8.6354e-02,  2.8140e-01,  1.2970e-02,
-2.0755e-01,  6.7548e-02, -3.6049e-02
}
,)"
R"(
{
 9.5728e-41,  5.3991e-40, -1.3764e-40,
-2.0389e-40,  2.4254e-40,  3.3492e-40,
 6.5289e-41, -3.0842e-40,  5.5850e-40,
 7.7599e-02,  2.5043e-02, -1.4099e-02,
-3.3184e-02,  5.6863e-01, -2.7001e-02,
-5.2659e-02,  5.4713e-02,  2.3991e-03,
 2.2010e-02, -3.9120e-02, -1.1558e-01,
 9.1633e-02,  1.3070e-01,  1.2489e-01,
-4.4040e-02, -1.6324e-02, -4.9631e-02,
-7.3548e-02, -2.0492e-01,  1.4043e-01,
-6.0411e-02,  5.7710e-02, -3.6840e-02,
 1.3173e-02,  2.3215e-03,  1.1820e-02,
 2.5772e-02, -1.3436e-01, -5.9285e-02,
-9.3983e-02,  1.1545e-01,  1.1602e-01,
-1.8505e-02,  6.1498e-02, -1.3097e-02,
 9.8690e-03, -2.1338e-02, -1.2175e-01,
 1.7936e-02, -2.7811e-02,  6.7037e-02,
-5.1401e-03,  7.6421e-02, -1.0794e-01,
 4.6409e-02,  3.4701e-01,  2.6587e-02,
 8.4175e-02,  5.2712e-01,  6.8999e-02,
-8.0756e-02,  1.9648e-01, -8.4639e-02,
 1.2818e-01,  4.0660e-02,  7.6715e-02,
 8.7991e-02,  4.6556e-01, -4.0025e-02,
 2.1251e-03, -8.3784e-03,  5.9859e-02,
 1.9835e-40, -3.4675e-40, -7.9692e-41,
-1.4304e-40,  2.3927e-40, -5.9796e-40,
 3.8209e-40, -6.3260e-41, -9.2501e-41,
 3.2007e-01,  1.5800e-01, -1.9594e-02,
-4.5315e-02,  1.0536e-01, -8.0692e-02,
 2.1185e-01, -3.1418e-01, -1.5257e-01,
 8.6294e-02, -1.3398e-01, -1.0694e-01,
 8.6084e-02, -1.2393e-03,  1.7549e-02,
-1.5504e-01, -1.3112e-01, -3.5905e-02,
-3.8190e-01,  3.8393e-01,  1.6587e-02,
 1.5002e-01,  1.9586e-01, -2.6260e-01,
-4.0159e-02, -8.2891e-02, -1.7761e-01,
-1.8611e-01, -1.1241e-02, -4.2538e-02,
-5.7898e-02,  2.4583e-01,  4.1590e-02,
 2.4890e-02,  7.9409e-03, -2.7418e-02,
 6.6194e-03, -4.2441e-02, -1.1167e-01,
-1.3236e-01, -7.9642e-02, -6.0623e-02,
-4.7198e-03,  5.6904e-02,  1.2651e-01,
 1.2925e-01, -5.9162e-02, -9.1949e-04,
 1.8668e-02, -2.6361e-02, -7.1042e-03,
-4.3178e-02,  2.6050e-04,  4.4799e-02,
 7.9674e-02,  2.7656e-02,  7.1211e-03,
 1.1463e-01,  1.0765e-01,  7.6066e-02,
-8.0780e-02, -5.4875e-02,  1.5209e-02,
-3.7365e-13, -3.7819e-13, -3.5929e-13,
-4.0298e-13, -4.0881e-13, -3.9033e-13,
-3.9409e-13, -3.9950e-13, -3.8277e-13,
-1.7847e-02, -1.7537e-02, -3.7313e-03,
 2.6531e-02,  7.5951e-02, -4.0134e-03,
 1.7387e-02,  6.0044e-02, -9.0211e-02,
 2.7091e-02,  8.8333e-02,  1.0619e-01,
 5.0470e-02,  1.2406e-02,  1.5503e-01,
-1.5936e-02, -2.2422e-01, -2.4640e-02,
-8.2430e-03, -1.4097e-02, -6.2474e-02,
 8.0534e-02,  1.8603e-01, -3.1725e-02,
-3.1621e-03,  2.0362e-03, -1.4002e-01,
-7.3799e-03,  1.5881e-01,  6.7195e-02,
 4.5946e-02,  2.4358e-01,  1.4677e-01,
-7.4788e-02,  6.7297e-02,  9.0735e-02,
-8.4553e-03, -1.1877e-02,  4.4209e-02,
-1.4281e-02, -6.8849e-02, -4.1386e-03,
 3.2286e-02,  4.7128e-02, -1.2988e-02,
-2.2990e-02, -8.9265e-02,  6.4050e-02,
-2.3354e-02,  1.3846e-01, -1.6256e-01,
-6.5661e-02, -2.8983e-02, -4.3497e-02,
 1.0597e-02, -2.3534e-02, -2.6068e-02,
-7.8812e-02,  1.9502e-01,  6.8938e-03,
 3.2025e-02,  2.3353e-02,  4.9225e-02,
-5.0273e-40,  1.2403e-41,  5.8127e-40,
 3.2777e-40, -3.5740e-40,  4.9781e-40,
-2.4198e-40, -4.6311e-40,  1.3330e-40,
-3.0803e-01,  1.7804e-01,  1.0604e-01,
 4.1405e-01,  1.9740e-01, -5.3067e-02,
 2.3738e-01, -1.6828e-01,  1.5338e-01,
 6.6857e-03,  1.8623e-01, -1.2126e-01,
-1.6323e-01, -1.2719e-02, -1.7743e-01,
-1.3612e-01, -3.4442e-02, -1.0552e-01,
-1.4560e-01,  1.8771e-01,  8.4508e-02,
 5.8732e-02, -2.2378e-01,  1.2673e-01,
 3.0455e-03,  3.8438e-02, -6.2235e-02,
 1.9951e-02,  2.6963e-01, -1.8594e-01,
-8.6550e-02, -1.3097e-01, -3.5032e-02,
 2.0423e-02, -9.0499e-02,  1.7130e-01,
-1.8592e-01,  6.6808e-02, -1.5768e-01,
-6.4402e-02, -1.2265e-01,  6.8487e-02,
 1.9899e-02,  9.3376e-02,  7.8577e-02,
-1.3384e-01, -7.6429e-02,  1.7142e-02,
-1.2385e-01, -1.1821e-01, -1.2716e-03,
 5.3770e-02,  1.4973e-01,  1.4762e-01,
-4.7688e-02, -1.1733e-01, -1.5032e-01,
-2.0699e-01, -9.4949e-02, -2.6374e-02,
 4.4489e-02,  1.8376e-02, -7.6844e-02,
 1.8831e-40, -2.6056e-40, -4.7602e-40,
-3.4079e-40,  1.5054e-40,  1.2387e-40,
 2.3040e-40,  1.4644e-40,  5.6365e-40,
-2.0809e-02,  5.3674e-03,  1.7057e-03,
 2.4160e-01,  4.1348e-01,  3.5215e-02,
 8.2154e-02,  2.0431e-01,  1.0366e-01,
-1.5149e-02,  1.0521e-01, -4.1706e-02,
-5.0651e-02,  2.3615e-02, -9.3860e-02,
-1.0823e-01, -6.3645e-02, -1.1573e-01,
-2.4116e-02,  1.3546e-02, -1.0298e-03,
 1.2102e-02,  2.2630e-02,  1.1375e-01,
 1.3966e-02,  1.0754e-01,  1.6621e-01,
 1.6213e-02,  2.0816e-01,  8.9441e-02,
-7.5452e-02,  3.4580e-03, -3.3317e-01,
 5.0917e-02,  1.3898e-01, -1.0723e-01,
 6.0473e-03,  8.9741e-02, -6.8206e-02,
-7.1770e-02, -3.5661e-01, -2.8935e-01,
-1.6324e-02,  2.5728e-02, -1.1281e-02,
-1.3390e-01, -9.3090e-02,  4.3366e-02,
 4.8620e-02,  1.4917e-01,  1.6295e-01,
 2.4123e-03, -7.6347e-02, -8.0226e-02,
 6.0740e-03,  3.7065e-02,  4.5518e-04,
-1.3793e-01,  2.3848e-01, -1.1199e-01,
 1.0422e-01,  1.1214e-01,  3.3457e-02,
-3.2827e-40,  5.9135e-40,  3.3773e-40,
-5.8903e-40, -5.9439e-41,  1.9973e-40,
-3.6141e-40, -4.7563e-40, -1.0222e-40,
 7.3457e-02, -8.2031e-02, -2.9504e-02,
-5.3420e-02,  4.9697e-02,  7.6779e-03,
 2.1180e-02,  1.1069e-02, -1.1940e-02,
 1.7302e-02,  9.9063e-02,  4.8847e-02,
 4.9513e-02,  2.4240e-01,  2.7174e-01,
 2.7487e-01,  1.9410e-01,  3.1165e-01,
-6.7532e-03, -1.1608e-01, -5.0876e-02,
 1.2107e-01,  3.1073e-01,  7.1681e-02,
-1.1411e-01, -1.7902e-01,  7.8898e-02,
-2.0117e-02,  3.6394e-01,  1.4546e-01,
-8.0861e-03, -4.3956e-02, -1.3473e-01,
 5.1519e-02, -3.1122e-01, -4.6847e-02,
 5.0405e-02, -1.0611e-02, -1.0557e-01,
-4.4346e-02, -1.4505e-01,  5.3977e-02,
-2.6288e-01,  1.8247e-02, -1.1606e-01,
 1.0706e-01, -9.3675e-02,  1.1757e-01,
-5.0440e-02, -1.1784e-01, -4.0599e-02,
 1.9618e-01,  9.9370e-02,  8.2258e-02,
 2.6762e-02, -5.0740e-02, -1.8302e-02,
 5.3340e-02,  6.5710e-02,  6.1552e-03,
-7.2158e-02, -3.5563e-02,  8.2140e-02,
 3.1534e-40,  3.6427e-40,  3.0437e-40,
 4.2856e-41, -4.7870e-40,  5.6317e-40,
-2.4673e-40, -6.9736e-41,  8.1050e-41,
 1.4544e-01,  8.2490e-02, -9.2349e-03,
 2.6124e-01,  2.7494e-01, -5.4946e-02,
 1.8233e-01,  1.2428e-01, -6.7498e-03,
 9.7639e-02, -6.2085e-03,  4.8154e-02,
 2.7379e-02, -1.8443e-01,  4.0402e-02,
 1.8893e-03, -5.2282e-03,  6.7548e-03,
-1.6559e-01,  9.7901e-02, -1.1869e-01,
-2.1287e-01,  4.1023e-01, -9.7379e-02,
-1.3767e-03, -1.6343e-01, -9.5059e-02,
-1.3547e-01,  2.0094e-01,  1.0102e-01,
-2.1311e-01, -1.5088e-01,  1.8175e-01,
 4.6946e-02, -1.3963e-01,  1.0220e-01,
 1.7536e-01, -2.4758e-01, -1.1481e-02,
 6.1596e-02, -4.0352e-01, -1.4348e-01,
 3.1690e-02,  1.7240e-01,  7.0780e-02,
 9.9953e-02, -1.4154e-01, -8.3038e-02,
 1.4527e-01, -2.1430e-01, -7.5840e-02,
 1.6146e-01,  3.7508e-02,  5.3833e-02,
 1.6723e-01,  1.7113e-01, -4.8512e-02,
 2.1319e-01,  4.7031e-01,  1.1570e-01,
 2.0330e-01,  2.4636e-01,  6.9924e-02,
-2.1165e-40, -1.9259e-40, -5.0990e-41,
-7.1298e-42, -4.2590e-41,  3.1709e-40,
 4.1065e-40, -4.2585e-41,  3.4243e-40,
-1.0338e-40,  4.6039e-40, -3.3818e-40,
-3.9589e-41,  5.9574e-40, -5.8014e-41,
 1.4505e-41, -3.5326e-40, -3.9806e-40,
 4.2423e-40, -1.7055e-40, -4.9666e-40,
 2.2853e-40, -2.4684e-40, -1.3794e-40,
-5.6764e-40, -1.7905e-40, -5.8915e-40,
-1.4755e-27, -2.0405e-28, -4.8677e-30,
-7.1151e-28, -9.7603e-29, -3.5264e-30,
-2.7455e-29, -5.7734e-30, -2.8633e-31,
-5.9960e-06, -5.9595e-06, -5.8686e-06,
-6.0381e-06, -6.0191e-06, -5.9605e-06,
-5.9849e-06, -5.9981e-06, -5.9654e-06,
-4.8277e-22, -7.0529e-22, -8.7179e-22,
-4.6334e-22, -6.3505e-22, -8.8438e-22,
-3.3883e-22, -4.2421e-22, -5.9002e-22,
-2.9574e-40,  4.0860e-40, -1.5966e-40,
-6.7527e-41,  7.6661e-41, -5.9491e-40,
 3.0843e-40,  8.1079e-41, -2.5140e-40,
-3.7315e-40,  9.4787e-41,  4.6794e-40,
 1.9383e-40,  5.0336e-41,  3.0561e-40,
-5.4286e-40,  5.5999e-40, -4.6977e-40
}
,)"
R"(
{
-1.7778e-01,  5.2351e-03,  1.6035e-02,
-9.7482e-02, -1.1056e-02, -5.0999e-02,
 1.7460e-01, -4.0005e-02, -5.0911e-02,
-9.3843e-02,  1.2640e-01, -1.5016e-02,
-5.2880e-01,  1.9469e-01, -9.0037e-02,
-8.9136e-02,  9.8632e-02, -1.5009e-01,
-1.8080e-01,  1.1396e-01, -2.6178e-02,
-1.6689e-02,  1.4132e-01, -6.7769e-03,
-2.1120e-02,  6.8616e-02, -7.8209e-02,
 4.8237e-02, -2.5303e-02,  1.7882e-02,
-4.2852e-02, -1.5071e-02, -3.3818e-02,
 1.3635e-01,  4.5330e-01,  2.1489e-01,
 2.7362e-02, -7.4152e-02,  2.3185e-03,
 1.8771e-01, -2.0827e-02, -7.5581e-02,
 1.4675e-01, -6.5552e-02,  4.2292e-02,
 1.3990e-01, -4.1598e-01,  2.1609e-03,
 1.5997e-01,  1.1375e-01, -1.8272e-02,
 1.9045e-02, -4.2702e-02, -2.5602e-02,
 1.6432e-01, -1.2783e-01, -1.8285e-03,
 2.9414e-01,  1.7401e-01, -2.6321e-01,
-1.0125e-01,  1.3565e-01,  1.5894e-02,
-3.7351e-40,  6.3010e-40, -1.2071e-40,
-4.6380e-40,  1.8442e-40, -3.5994e-40,
-2.1459e-40, -4.3455e-40, -6.1978e-41,
-2.3638e-40, -4.6965e-40, -3.4232e-40,
-1.6517e-40,  4.7178e-40, -1.6757e-40,
 6.7890e-41, -4.3000e-40,  1.8323e-40,
 4.5416e-40, -2.9010e-40, -1.5200e-40,
-3.5533e-40, -8.7351e-41,  6.5595e-42,
 5.1625e-40, -6.0418e-40, -2.7846e-40,
-2.1861e-10, -2.2422e-10, -2.1298e-10,
-2.2653e-10, -2.3500e-10, -2.2512e-10,
-2.1802e-10, -2.2681e-10, -2.1608e-10,
-3.2862e-40,  3.4241e-40, -1.3264e-40,
 2.8762e-40,  1.3843e-40,  3.0949e-40,
-3.7702e-40,  2.6194e-40,  2.1451e-40,
-3.2283e-40, -5.5487e-40,  5.8744e-40,
 1.6124e-40,  3.3512e-40,  3.1454e-40,
-3.5417e-40, -5.7692e-40,  5.5184e-40,
 3.5641e-40, -4.3187e-40, -3.5314e-40,
 4.9246e-40,  5.9593e-40,  8.3132e-41,
-2.3841e-40, -5.6196e-40, -3.2230e-41,
 4.3824e-40, -3.8344e-40, -9.9086e-42,
-2.9323e-40,  2.1916e-40,  4.4739e-40,
 5.6837e-41,  5.1796e-41, -2.4338e-40,
-2.2853e-40, -3.8920e-40,  6.1587e-40,
-2.9474e-41,  4.6214e-40, -3.6292e-40,
-1.4928e-40, -3.6708e-41,  5.2020e-40,
-1.2983e-12, -2.6539e-12, -1.9817e-12,
-6.5613e-12, -1.0255e-11, -6.6919e-12,
-8.3217e-12, -1.7832e-11, -1.1086e-11,
-4.9138e-40, -9.0061e-42,  4.6251e-40,
-2.9970e-41, -2.5468e-40, -3.5660e-40,
 2.5450e-40, -9.5634e-38, -3.2369e-32,
-1.0233e-06, -8.2108e-07, -1.1668e-06,
-5.9592e-07, -3.9529e-07, -5.7435e-07,
-6.0253e-07, -3.8785e-07, -4.9365e-07,
-8.9372e-37, -2.1590e-36, -2.1060e-40,
-1.5666e-35, -1.1466e-38, -2.3366e-40,
-5.4077e-38,  5.0487e-40, -3.3736e-40,
-1.5357e-13, -8.4607e-14, -1.9206e-16,
-5.5373e-13, -3.0787e-13, -1.0513e-15,
-1.0468e-13, -8.6069e-14, -2.2453e-16,
-4.7501e-14, -1.3426e-13, -1.1133e-13,
-1.3801e-14, -2.4024e-14, -3.5120e-14,
-1.9817e-17, -1.3229e-17, -3.2854e-17,
-1.4365e-18, -4.1143e-15, -9.2614e-14,
-1.1174e-19, -1.6235e-15, -1.5600e-13,
-1.2643e-21, -3.9578e-17, -1.2038e-14,
-2.9789e-40, -4.6452e-40,  1.5649e-40,
-1.8445e-40, -5.2942e-40,  2.5130e-40,
 6.2269e-40,  3.9166e-41, -2.4197e-40,
 9.0835e-02, -5.2035e-03, -2.5980e-02,
-1.0090e-01, -7.4167e-02,  1.3364e-01,
 1.0302e-01, -1.5250e-01,  1.2417e-01,
 4.7205e-02, -2.3839e-01, -1.4983e-02,
 5.6824e-02, -1.8259e-02,  9.6426e-02,
 5.9740e-03, -1.4198e-01, -2.1076e-01,
-1.5837e-01,  6.4749e-02, -2.1417e-01,
-3.4048e-02,  4.9638e-01,  2.0984e-03,
-1.4335e-01,  4.8295e-02, -9.2209e-02,
 1.9450e-01, -1.3603e-01,  1.2008e-01,
 1.6803e-01,  5.6805e-02,  1.1518e-01,
 5.9320e-02, -3.8200e-02, -1.1340e-01,
-8.6877e-02,  1.1533e-01, -4.9870e-02,
-7.2811e-03,  2.5730e-01, -1.8536e-01,
-6.4965e-02,  1.0364e-01,  1.3706e-02,
 4.6974e-02, -1.0049e-01, -1.7460e-01,
-1.7910e-01,  3.0771e-01, -2.5757e-01,
-2.2846e-02, -3.7491e-03, -5.2171e-03,
-4.7762e-02, -4.7776e-02,  5.1125e-01,
-2.0210e-01,  6.4815e-02, -6.1606e-02,
 7.3686e-04, -1.6226e-01, -3.0327e-02,
 5.6501e-40,  5.2828e-40, -5.9773e-40,
-4.3530e-40, -1.1658e-40,  4.9705e-41,
 4.8101e-40,  5.0236e-40,  2.0476e-40,
-1.1412e-01,  1.3391e-01, -1.2279e-01,
 1.4370e-01,  3.7617e-01,  7.1407e-02,
 6.9661e-02,  3.1963e-01, -1.7089e-02,
-4.7530e-02,  6.5411e-02, -2.4915e-02,
 3.3429e-02, -1.3899e-01, -3.3875e-02,
-1.9261e-02, -1.3162e-01,  1.1415e-01,
 2.0599e-02, -3.8667e-02, -7.2190e-02,
-2.1112e-01, -1.6525e-01, -2.3430e-02,
-1.2287e-02, -2.6637e-01,  1.0859e-03,
-2.8564e-02,  4.8846e-02,  4.2412e-02,
 1.4632e-01,  1.5974e-02, -1.0699e-01,
 5.5661e-02, -2.0952e-01,  2.4151e-02,
-2.3510e-02, -5.0570e-02,  1.0799e-01,
 1.7495e-01, -1.5788e-03, -1.6447e-02,
 7.7642e-02, -9.3888e-02,  1.3891e-03,
 2.2658e-02,  1.4058e-01,  1.0639e-01,
-5.5626e-02, -3.0794e-01, -5.7160e-02,
 1.0874e-01, -8.3907e-02,  4.2106e-02,
 1.7688e-02,  1.8090e-01, -2.1718e-03,
-1.0659e-02, -2.1302e-01,  1.0056e-01,
-6.0693e-02, -2.3624e-02,  6.3688e-03,
-2.7320e-40, -1.3336e-40,  2.4202e-41,
-7.1225e-41,  1.2848e-40,  1.5426e-40,
-4.2798e-40,  6.5075e-41,  6.2629e-40,
 1.6905e-01, -1.7379e-01, -2.1360e-02,
-2.9396e-01,  1.1782e-01,  7.9111e-02,
-6.4767e-03, -1.9949e-01,  5.4243e-02,
-3.2753e-02, -1.5810e-01,  5.2257e-02,
-1.8133e-02,  2.0548e-01, -2.8071e-01,
-5.3725e-02,  8.4067e-02, -7.4639e-02,
 8.9137e-02, -2.3078e-01, -1.9626e-01,
 3.1276e-01,  1.5332e-01, -1.9590e-01,
-1.8318e-02,  6.8460e-02,  9.1476e-03,
 8.2398e-02,  8.5883e-03,  7.6830e-02,
-1.4580e-01,  4.6253e-01, -3.1900e-01,
-1.1051e-01,  6.3807e-02, -2.5130e-02,
-1.2029e-01, -3.8982e-03,  2.1654e-02,
-3.2017e-01,  2.0265e-01, -1.7311e-01,
-1.3229e-02,  1.3805e-01, -6.2689e-02,
-3.6619e-02, -1.9366e-01,  2.7177e-01,
 5.5937e-02,  7.9713e-02, -2.3872e-01,
-3.9690e-02,  2.2914e-02, -1.7779e-02,
 1.1110e-01,  1.6618e-01,  3.6139e-01,
 7.9777e-02,  4.3655e-01,  3.0597e-01,
-5.5125e-02,  6.1229e-02,  1.2414e-01,
 2.1644e-40,  7.2343e-41,  5.5580e-40,
-4.3927e-40,  5.0561e-40, -1.5560e-41,
-3.2783e-40, -8.8219e-41,  5.4415e-40,
-6.7176e-02, -3.4930e-02, -2.7087e-02,
 1.0489e-01,  2.1178e-01, -1.6752e-01,
-1.2627e-01, -2.4207e-01, -7.4667e-02,
-3.1470e-02, -1.3365e-02,  8.7742e-02,
-2.2809e-02, -4.7991e-01,  2.4740e-02,
 6.4418e-02,  3.4818e-02, -2.9275e-01,
-2.8830e-01, -7.0458e-02,  7.8922e-02,
-1.4436e-01,  4.1068e-02,  6.2896e-02,
 4.1061e-03,  2.1844e-01,  9.0488e-02,
-1.1085e-01,  8.3761e-02,  3.2634e-02,
 3.2470e-01, -2.7760e-01,  4.1235e-02,
 8.6625e-02,  2.6816e-01, -1.3560e-01,
 3.8789e-01,  3.2406e-01,  1.0631e-01,
 7.5131e-02, -2.0206e-01,  1.3027e-01,
 4.0382e-02,  2.4350e-01, -3.6042e-03,
-1.0063e-01,  1.9418e-01, -7.7039e-02,
 9.4531e-03,  7.1605e-02,  1.4004e-01,
-2.0591e-02,  4.5944e-02, -2.6721e-03,
-3.4665e-03,  2.2560e-01, -8.2930e-02,
-1.5507e-01,  2.7206e-01, -2.8665e-02,
-3.4909e-03,  1.7696e-02, -8.5492e-02,
 2.1541e-40, -3.3029e-40,  1.7678e-40,
-3.9857e-40, -1.1965e-40, -8.6754e-41,
-4.0721e-40,  2.2073e-41,  4.2728e-40,
-1.0496e-02,  5.4120e-02, -1.6498e-02,
-5.9387e-02,  2.3757e-01, -8.0381e-02,
 2.3739e-02, -1.3715e-01, -3.0906e-02,
-8.5760e-03,  2.4518e-02, -6.9090e-02,
 2.1623e-02,  8.9641e-02,  9.9031e-02,
-1.0052e-02,  4.6506e-02, -1.5756e-01,
 8.5003e-02, -3.6434e-03,  1.3816e-02,
 9.0532e-02,  2.3661e-01,  1.8077e-01,
 2.8120e-02,  4.3753e-02,  2.2981e-02,
 3.5830e-02,  5.7995e-02, -5.6879e-03,
 3.7708e-02, -2.6373e-01,  2.0886e-01,
-4.0632e-02,  1.6891e-01, -6.8996e-02,
-1.1972e-01, -4.3628e-02,  2.0278e-02,
-1.4818e-01,  4.0844e-02,  1.5917e-01,
-4.5684e-02,  1.4075e-01, -2.0784e-02,
-1.1533e-03, -2.7897e-01, -8.8707e-02,
-1.7907e-02,  1.8400e-01,  1.1026e-01,
-2.3183e-03,  6.3875e-02, -4.2394e-03,
 3.2021e-02, -8.8955e-02, -2.2298e-02,
 8.1353e-02,  3.3079e-01, -2.0616e-01,
-3.5802e-02,  4.9804e-02, -9.2712e-02,
-1.5940e-07, -1.6158e-07, -1.5812e-07,
-1.6273e-07, -1.6555e-07, -1.6260e-07,
-1.5867e-07, -1.6192e-07, -1.5975e-07
}
,)"
R"(
{
-1.5080e-02,  1.1294e-01,  7.1187e-02,
 1.1628e-02, -8.4938e-01,  8.5457e-02,
-3.9642e-02, -2.3879e-02,  1.0029e-02,
 2.6648e-40,  9.1590e-41,  3.3285e-40,
-3.3445e-40, -2.5194e-40, -2.0946e-40,
 3.6800e-40, -1.1584e-40,  6.2195e-40,
-1.3560e-41, -8.0151e-41,  4.4048e-40,
-4.1209e-40,  2.7411e-40,  3.2419e-40,
 5.8333e-40,  1.1503e-40, -5.0783e-40,
-5.5301e-02, -2.4971e-02,  4.9251e-02,
-2.5589e-01,  1.6560e-01, -8.0956e-02,
 4.0518e-01,  3.1320e-02, -1.4262e-01,
 1.2250e-02,  5.1989e-02,  3.0706e-03,
-7.9534e-02, -1.9801e-01, -2.7791e-02,
 2.1768e-01,  6.9978e-02, -4.2325e-02,
-1.9165e-02, -2.1179e-02, -2.1558e-02,
 3.6816e-01, -5.2929e-02,  9.5790e-02,
 2.8095e-01, -1.4731e-01,  3.4182e-02,
 2.3702e-02,  4.0764e-02,  3.5767e-02,
-8.4586e-02,  1.9025e-01, -1.6794e-01,
-1.0273e-02,  3.2259e-01, -1.5841e-01,
 2.6794e-01,  5.2084e-02,  1.2761e-02,
-1.1169e-01, -1.7808e-01,  1.1363e-01,
-1.3808e-01, -1.7764e-02, -1.7420e-02,
 1.5840e-02, -2.3405e-01,  7.6361e-03,
-6.6082e-02,  7.9778e-02, -2.0423e-01,
-1.9594e-02, -6.3370e-02,  3.3351e-02,
-2.0396e-40, -3.0207e-40, -3.2364e-40,
 2.3575e-40,  5.8301e-41, -3.7432e-40,
-3.6291e-40,  3.3441e-40,  1.4574e-40,
-4.3792e-40, -2.5814e-40, -3.4986e-41,
-3.4920e-40, -4.4757e-40,  3.2192e-40,
 4.7222e-40, -7.3197e-41, -3.4635e-40,
 5.1495e-02,  7.8843e-02,  4.2243e-02,
-2.1245e-01,  1.9568e-01,  7.9369e-03,
 2.2795e-02,  2.2801e-02,  7.6895e-02,
 3.0044e-01, -1.4041e-01, -2.3677e-02,
-1.1656e-01, -7.5113e-02,  1.0625e-02,
-1.2133e-02,  5.0658e-02, -7.2944e-02,
-3.3652e-02, -2.0452e-01, -4.1048e-02,
 2.8531e-01,  1.2116e-01, -2.1526e-02,
-2.4564e-01, -4.1870e-02, -5.5819e-02,
-2.3157e-01, -2.5594e-02,  1.1154e-01,
 2.1234e-01,  3.2762e-01, -2.9000e-01,
 1.8591e-02, -5.9820e-02, -9.0807e-02,
-3.0027e-01, -1.8370e-01,  1.2086e-02,
 2.1178e-02,  2.9559e-01,  1.2966e-01,
 6.8542e-02,  7.7710e-03, -6.0304e-02,
 3.3019e-03, -1.9135e-02,  9.3227e-03,
-9.9003e-03, -1.0101e-01, -3.3513e-01,
-8.4091e-03, -1.5918e-02, -3.4323e-02,
 3.8770e-40, -2.8639e-40,  4.6953e-40,
 4.2631e-40,  6.2568e-41, -5.3500e-40,
-2.1987e-40,  1.3435e-40,  4.4101e-40,
-3.9973e-40,  6.3046e-40,  1.6046e-40,
 4.4338e-40,  1.6940e-41,  4.1598e-40,
 2.6132e-40, -2.9888e-40, -7.5708e-41,
-1.5991e-02,  8.2749e-02, -6.3776e-02,
-3.2220e-03,  4.1443e-02, -8.1219e-02,
-1.1231e-01,  6.7586e-01, -1.7600e-01,
-4.0371e-02, -7.9044e-02,  1.2451e-01,
 4.1907e-02, -8.8159e-02, -1.1229e-01,
-4.0654e-03, -4.4087e-03,  1.2942e-01,
 9.3318e-03, -6.5085e-02,  1.0165e-02,
-2.8758e-02, -4.9997e-02,  4.6069e-02,
 4.2107e-04,  2.1718e-01,  3.1080e-03,
-9.1277e-03, -2.8568e-02,  1.6202e-02,
-8.2490e-03,  1.2888e-01, -1.3159e-01,
 1.6065e-02,  4.0143e-02,  2.7043e-01,
-3.4809e-02, -8.1302e-03,  6.0786e-02,
 5.1845e-02,  4.6995e-01, -1.0392e-02,
 2.3359e-02, -1.8364e-01, -3.7343e-01,
-8.2996e-02,  9.7724e-02, -6.1012e-02,
 2.8225e-02,  8.8706e-02,  1.3443e-02,
 3.7515e-03,  1.7772e-02,  6.5945e-03,
-7.3847e-12, -7.5629e-12, -6.9337e-12,
-7.6292e-12, -7.8624e-12, -7.2877e-12,
-7.0582e-12, -7.3197e-12, -6.8467e-12,
 1.5445e-11,  2.0754e-11,  2.0524e-11,
 2.1239e-11,  2.5909e-11,  2.5983e-11,
 2.0986e-11,  2.5190e-11,  2.2478e-11,
-4.7164e-02, -2.4754e-02, -1.8256e-02,
 1.0526e-01, -4.6010e-03, -2.2784e-02,
-5.2028e-02, -1.6408e-01,  7.9112e-03,
-8.1863e-02,  4.2772e-02, -9.9446e-04,
-5.5521e-02, -1.1264e-01, -4.5782e-02,
-1.1026e-01,  2.1443e-02, -4.5120e-02,
-1.4141e-02, -2.8116e-03,  2.6990e-02,
-2.0201e-01,  4.3214e-01,  2.9373e-02,
-2.1768e-01, -2.7230e-02,  5.5396e-03,
 5.0196e-02,  1.5506e-01, -5.7328e-02,
 4.8323e-02,  3.8243e-02, -1.3533e-01,
-9.8862e-03, -5.6971e-02, -7.1500e-02,
 1.0272e-01,  7.4686e-02,  7.4732e-02,
 8.3744e-02,  1.5834e-01,  2.9221e-02,
 6.5641e-02,  7.7697e-02,  3.5746e-02,
-1.6614e-01, -2.3128e-01,  4.4691e-02,
 6.3546e-02, -3.8105e-01,  3.4110e-02,
-3.5022e-02, -2.3782e-02,  2.8664e-02,
-3.8813e-41, -2.8626e-40, -9.0218e-41,
 4.1216e-40, -4.4215e-40,  3.1198e-40,
 5.6281e-40,  2.0477e-40,  2.7797e-40,
-4.4903e-40, -6.2574e-41,  4.9971e-40,
 5.0135e-40, -3.1945e-40, -2.4694e-40,
 2.6587e-40, -4.9583e-40, -4.9771e-40,
 3.7139e-02,  5.2936e-04, -2.3658e-02,
-3.6199e-01, -5.1912e-02, -5.1969e-02,
 2.5415e-01,  2.4109e-01,  9.8721e-03,
 5.5061e-02, -4.7469e-02,  3.0045e-02,
 2.1565e-03, -2.3866e-02, -2.3496e-02,
 6.0892e-02, -4.6442e-04, -5.0200e-02,
 5.4971e-02, -1.7234e-02, -3.2759e-03,
 4.8225e-01, -1.1234e-01,  3.8257e-02,
 5.2105e-02, -2.8473e-03, -1.0355e-02,
-9.5654e-03, -1.8751e-01,  1.7079e-02,
 7.0133e-02,  7.6363e-01, -8.7388e-02,
-5.6536e-02, -1.9152e-01, -1.6043e-01,
 2.0359e-01,  7.4214e-02,  3.1970e-02,
-1.8199e-01, -1.9386e-01, -2.5967e-03,
-3.4609e-02,  3.3870e-02,  5.8835e-02,
 8.8220e-02,  9.9265e-02,  7.1240e-03,
-9.1395e-02, -3.1699e-01, -2.9120e-02,
-1.8436e-02, -2.1432e-02, -4.5465e-02,
-3.2013e-40,  3.2019e-40,  4.8747e-41,
 2.6585e-40,  6.1463e-40,  1.4176e-40,
-1.5286e-40,  3.0543e-40,  7.2032e-41,
-6.0758e-40, -3.6200e-40,  1.2123e-40,
 1.3627e-40,  3.2983e-40,  3.6171e-40,
-4.2148e-40,  1.1102e-40,  3.2714e-40,
-3.4763e-02, -3.1632e-02,  3.0044e-02,
-2.0935e-01,  1.3533e-01, -9.1607e-03,
-1.5931e-01,  1.0771e-01, -6.6518e-02,
 2.4399e-02,  2.2923e-03,  5.1575e-02,
-1.4154e-01, -1.0013e-02, -7.5696e-02,
 1.0849e-01,  1.2575e-01, -7.3161e-02,
-1.5217e-02, -2.7659e-02, -3.1401e-02,
 3.4960e-01,  7.2390e-02,  2.0722e-02,
 3.9440e-01,  9.1821e-04,  1.7842e-02,
-1.5670e-02,  5.3020e-02,  6.0536e-02,
-1.8853e-01,  2.7532e-01, -1.9681e-01,
 8.3258e-02,  9.4285e-02, -1.2695e-01,
 2.7593e-01,  1.1456e-01,  1.6048e-02,
-5.1675e-01,  1.4727e-01,  7.5170e-02,
-6.9143e-02, -9.2948e-02,  3.4687e-02,
 1.4128e-02, -7.9962e-02,  8.0446e-02,
 3.7011e-02, -1.3400e-01, -2.0725e-02,
-6.4981e-03,  7.0724e-02,  6.6167e-02,
-4.5940e-41,  2.5437e-40, -3.3111e-40,
 5.9661e-40,  6.2521e-40,  5.6418e-40,
 1.9187e-40, -5.8872e-40,  5.5747e-40,
-1.6402e-11, -2.2097e-11, -1.7224e-11,
-2.2755e-11, -2.9977e-11, -2.1231e-11,
-1.3688e-11, -1.7479e-11, -1.3081e-11,
 6.4790e-03, -3.8464e-03, -1.0008e-02,
-2.6001e-02, -7.9483e-02,  3.3711e-02,
 2.6659e-03, -3.2634e-02,  1.0767e-02,
 4.9939e-03,  1.4064e-02, -3.4294e-02,
 4.8529e-02,  6.3386e-01, -3.6805e-02,
-1.3703e-01,  2.5878e-02, -4.8617e-02,
 3.2186e-02,  6.6382e-02,  1.9305e-02,
 7.0196e-02, -1.6892e-01, -2.8980e-02,
 9.7762e-02,  9.7998e-03, -5.1620e-03,
 5.0753e-02, -4.5071e-03, -3.9836e-02,
-6.0381e-02, -9.2016e-02,  9.5433e-02,
-1.0045e-02,  8.7955e-03,  4.9429e-02,
-1.8363e-02, -1.1912e-01,  9.7347e-03,
-1.5657e-01, -2.1035e-01, -4.9737e-02,
-3.0025e-02, -6.4959e-02, -5.6107e-02,
 3.2927e-40,  5.7263e-40,  6.2889e-40,
-6.0716e-39,  5.3050e-41, -1.7152e-40,
-3.2493e-38, -1.5841e-40, -1.9343e-40,
 4.9763e-40,  5.5142e-40, -4.3462e-40,
-2.2649e-40,  1.4321e-40, -2.6779e-40,
 2.3072e-41,  5.4080e-40, -6.4200e-41,
 2.2827e-40, -5.4515e-41, -4.1768e-40,
 3.9033e-40,  6.1988e-41,  5.9877e-40,
-4.3355e-41, -5.1088e-40,  5.9845e-40,
-4.8238e-40, -1.8586e-40,  4.8699e-40,
-9.7225e-41,  4.3387e-40, -4.3683e-40,
-7.9278e-41, -5.3614e-40,  2.1911e-40,
-3.3982e-40, -5.3335e-40,  3.8540e-40,
 1.9051e-40, -2.0840e-40,  2.2868e-40,
-3.5020e-40, -3.4276e-40,  2.7395e-42,
 3.9197e-40,  6.1843e-40, -1.5888e-40,
 4.3516e-40, -6.1852e-40, -5.3692e-40,
-4.3268e-40,  3.5154e-40,  3.4477e-40,
-4.8414e-40,  2.2647e-40, -2.5591e-40,
 4.6326e-40, -3.0462e-40,  4.7817e-40,
-4.9853e-40, -5.3425e-40, -2.9848e-40,
-1.3329e-07, -1.3784e-07, -1.3049e-07,
-1.3376e-07, -1.3905e-07, -1.3204e-07,
-1.2479e-07, -1.2994e-07, -1.2410e-07
}
,)"
R"(
{
-2.5964e-02,  2.9670e-02,  1.2100e-01,
-3.0371e-02, -1.5277e-02, -1.8589e-01,
-1.8650e-02, -1.2852e-01, -6.6297e-02,
 9.7934e-04, -5.1835e-02, -1.0278e-03,
-1.2336e-02,  2.2130e-01, -1.2373e-01,
-2.3451e-02,  3.4217e-02, -1.0118e-02,
-3.0558e-01, -8.5390e-02, -1.4360e-02,
 1.2473e-01, -1.7005e-02, -3.6816e-02,
-8.9125e-02, -6.1400e-02, -2.0623e-02,
 1.3736e-02,  1.2441e-02, -4.3491e-02,
 6.4806e-02,  3.7012e-01,  3.8064e-02,
-1.3731e-02, -2.4859e-01, -2.5450e-01,
-6.5111e-03, -1.4271e-01, -5.0481e-02,
 5.3240e-02, -3.4843e-02, -2.2703e-02,
 3.7414e-02,  1.0334e-01, -7.2237e-02,
 1.4216e-02,  3.4231e-02, -2.0890e-02,
 2.7879e-02,  1.3717e-01,  4.5864e-03,
 3.0460e-03, -1.1734e-01,  4.4439e-02,
 6.4825e-03,  1.6324e-02,  1.4928e-02,
-8.8420e-02, -1.0779e-01, -9.0653e-02,
 3.1086e-02, -2.9067e-02, -8.8488e-02,
-1.6779e-40, -6.3646e-41, -6.2486e-40,
 2.3154e-40,  2.8049e-40,  3.7718e-40,
-3.3950e-40, -3.1501e-40,  5.8709e-40,
 2.1435e-02, -4.3732e-01,  1.5520e-02,
 3.4080e-02,  1.9912e-01, -8.1413e-02,
-3.2816e-02,  5.7844e-02,  8.9258e-03,
-1.1662e-02, -1.1721e-02,  4.3033e-02,
 5.2135e-02, -2.2503e-01,  2.3941e-01,
 3.8400e-02,  1.8075e-01, -1.4776e-01,
 2.6784e-01,  2.2817e-01, -3.0553e-03,
-6.7998e-02, -1.2050e-01,  1.4714e-02,
 2.4045e-02, -1.4329e-02, -1.6705e-02,
-1.1421e-02,  4.2139e-02,  4.2944e-02,
 1.8809e-02, -2.5221e-01,  9.7562e-02,
-4.1600e-02,  4.0069e-03,  7.5290e-02,
-2.0092e-02,  2.3537e-01,  2.4356e-02,
 3.1957e-02, -4.8573e-02,  2.9379e-02,
 6.4562e-03, -1.1527e-01, -9.1223e-02,
-2.3432e-02,  5.2881e-02, -7.3239e-02,
-3.7048e-02, -2.1481e-01,  5.9801e-05,
-4.2646e-02, -1.8366e-02, -1.0681e-01,
-1.3366e-01, -1.7123e-01, -3.5629e-02,
 1.1216e-01,  1.1479e-01,  9.5297e-02,
 2.4728e-02, -7.3135e-03, -3.4373e-02,
-2.3917e-40, -4.1869e-41,  3.7775e-41,
 2.8931e-40, -9.4850e-41,  2.5694e-40,
 3.3549e-40, -2.4334e-40, -5.5933e-41,
-2.0900e-02,  2.1203e-02, -4.7169e-02,
 2.3632e-02, -7.1148e-01,  4.9722e-02,
-7.8963e-03,  5.0689e-02,  2.2619e-02,
-4.7364e-03,  3.2037e-02,  1.1004e-02,
-4.3001e-03,  2.5245e-01,  5.9112e-02,
 2.8932e-02, -1.1267e-01, -2.3739e-01,
-6.5379e-02,  5.2462e-03, -1.6807e-02,
 1.0960e-01,  1.7943e-01, -6.3043e-03,
 9.3102e-02,  7.3103e-02,  2.5259e-02,
 5.6835e-02,  4.0467e-02,  2.5447e-03,
 9.4599e-02,  2.5222e-01,  6.9855e-02,
 4.4758e-02,  1.8073e-01,  1.5075e-01,
 2.0329e-02, -4.9412e-02,  2.0663e-02,
-7.1648e-03,  1.4986e-01,  2.1212e-01,
 2.7657e-02, -6.8660e-02,  1.7321e-02,
 1.0629e-02, -1.0722e-02,  2.8247e-02,
-1.1303e-02,  1.0076e-01, -4.0592e-01,
 2.6744e-02,  7.3650e-02,  5.7966e-02,
 2.8122e-02, -7.5961e-02, -9.4797e-03,
-1.3010e-01, -5.4184e-01, -1.3619e-01,
-1.8661e-03, -1.4357e-01,  7.9520e-03,
-1.3538e-09, -1.6580e-09, -1.7289e-09,
-1.2386e-09, -1.5132e-09, -1.5987e-09,
-1.1157e-09, -1.3420e-09, -1.4090e-09,
 1.5441e-02, -1.8142e-01, -8.6802e-02,
-4.0983e-02,  2.4351e-01, -5.8181e-02,
-2.9568e-02,  3.9561e-03,  3.4181e-02,
-2.9210e-02,  2.5403e-02,  9.1331e-02,
 2.3621e-02,  2.3954e-01,  5.2487e-02,
 1.6509e-02, -6.2728e-02,  1.3448e-02,
 1.2855e-01,  1.1892e-02, -1.3356e-02,
 1.0810e-01,  1.6760e-01, -3.2040e-02,
 6.2209e-02,  4.0682e-02,  3.9772e-02,
-6.1711e-03,  5.0588e-02, -1.0811e-01,
 1.5744e-02,  1.6091e-01, -6.1739e-02,
-5.6717e-02, -1.0657e-02, -3.7943e-02,
-4.0595e-02,  8.0149e-02,  2.0216e-02,
 3.8838e-02, -6.3586e-01,  2.3785e-01,
-1.0472e-02,  6.3899e-02, -8.2184e-02,
-1.9137e-02,  8.1163e-02,  6.7065e-02,
-2.2377e-03,  1.1860e-01,  3.4122e-02,
 1.0501e-02,  2.9851e-02,  7.5841e-02,
 5.8970e-02, -1.2188e-01,  7.7982e-02,
-2.6516e-02, -4.1289e-01,  2.1471e-02,
 3.3957e-02,  3.5762e-02, -5.7857e-02,
-2.7357e-30, -3.4780e-30, -3.0306e-30,
-1.5188e-30, -1.9888e-30, -1.8755e-30,
-7.7431e-31, -9.7571e-31, -9.7402e-31,
-1.8497e-02, -2.4554e-02,  1.4428e-01,
 1.4217e-02, -2.3647e-01,  8.4097e-02,
-1.0251e-02, -4.2137e-03,  6.0831e-03,
 1.7742e-03,  2.1487e-02,  3.3147e-02,
-1.0971e-02,  3.0162e-01,  5.2391e-02,
 1.8341e-02, -1.3390e-01,  9.4303e-02,
-1.5685e-01,  9.8434e-02, -1.2502e-03,
 3.1370e-01, -2.8879e-02,  2.6313e-03,
 1.7548e-02,  6.6741e-03, -1.7681e-03,
 5.2062e-02,  6.6914e-02,  7.5256e-03,
 2.4966e-02,  2.8081e-01,  2.9815e-02,
 2.2375e-02,  1.4257e-03, -7.4702e-02,
 1.5372e-02,  3.9587e-02,  4.6909e-02,
-2.2911e-02, -1.4568e-01, -3.8964e-01,
 2.2850e-02, -4.2297e-02,  6.5736e-02,
-6.9905e-03, -6.3972e-02, -1.8430e-01,
 4.4453e-03,  2.0687e-01,  3.0032e-01,
 1.7243e-02,  9.8548e-03, -9.7476e-02,
-7.9682e-04, -2.1199e-01, -4.3461e-02,
-4.2929e-02, -2.8227e-01,  2.8997e-02,
-1.8741e-03,  1.1166e-02,  1.8381e-03,
-5.6725e-16, -1.0368e-15, -1.1480e-15,
-5.5537e-16, -9.9929e-16, -1.1499e-15,
-3.8787e-16, -6.4019e-16, -7.7595e-16,
 4.4505e-02,  8.8803e-02,  1.1384e-02,
-3.9434e-02,  1.9319e-01, -1.2016e-02,
-4.6072e-02,  1.1769e-01,  7.4816e-03,
-3.7856e-02, -1.7147e-02,  1.5984e-01,
-2.6459e-02,  1.7469e-01,  1.2584e-01,
 1.6387e-02,  1.7370e-01, -1.7350e-01,
-3.0008e-01,  2.1485e-01, -5.4302e-02,
 5.7724e-02,  3.2168e-01, -2.5261e-02,
 6.9277e-02,  7.5035e-02,  6.3485e-02,
-1.1688e-01,  2.6068e-02, -1.3490e-01,
-1.6085e-01,  1.9409e-01,  1.1434e-01,
-7.3819e-02, -7.7880e-02,  7.3699e-03,
-9.9972e-02,  1.3554e-01,  2.1656e-02,
-8.8303e-02,  5.4435e-01, -4.0582e-02,
-3.4805e-02, -1.5291e-01, -3.6917e-02,
-3.4377e-02, -3.3086e-02, -9.5097e-02,
-7.4538e-03,  2.2545e-01, -2.6380e-02,
 1.4440e-02,  1.3205e-01,  1.6164e-01,
 9.2164e-02, -8.4307e-02,  7.8922e-02,
 1.2519e-01, -6.1809e-01, -1.0895e-01,
 6.2744e-02, -4.4951e-02, -3.2548e-02,
-2.5422e-21, -6.3849e-21, -9.5560e-21,
-1.9248e-21, -4.7107e-21, -6.4244e-21,
-1.4638e-21, -3.1947e-21, -3.7663e-21,
-8.6113e-03, -7.0987e-02,  5.8265e-02,
-1.3148e-02,  5.6371e-01,  5.0580e-02,
 1.1741e-02, -3.5614e-02, -6.1265e-02,
 1.4758e-03,  3.3349e-02, -1.0867e-02,
-4.0234e-02,  1.9894e-01,  1.3972e-01,
-1.9167e-02, -4.1723e-02, -1.9982e-01,
-3.0756e-01,  2.6284e-02, -1.9058e-02,
-7.9349e-04,  1.2644e-01,  2.9567e-02,
-3.9274e-02,  1.1030e-02, -9.4885e-03,
 1.3541e-02,  1.7044e-01,  8.9626e-02,
 6.6814e-02,  2.6430e-01,  1.7409e-01,
-6.1034e-04,  1.7569e-02,  1.3090e-01,
-4.1941e-03,  8.9599e-02, -3.3684e-02,
-1.1310e-02, -4.3731e-01,  5.7177e-02,
-4.5718e-04,  1.0175e-01,  4.1211e-02,
 2.9756e-02, -1.1601e-01, -7.3171e-02,
 2.7939e-02,  2.1334e-01, -4.0210e-01,
-8.6847e-03,  8.1829e-02,  4.4225e-02,
-1.1411e-01, -1.7697e-01, -5.8087e-02,
 7.9613e-02, -4.2814e-01, -1.0814e-01,
-3.0610e-02,  1.1342e-03, -2.2322e-03,
-1.1254e-10, -1.4207e-10, -1.5402e-10,
-9.9123e-11, -1.2394e-10, -1.3338e-10,
-8.8840e-11, -1.0857e-10, -1.1463e-10,
 3.0283e-02, -5.6191e-02, -1.0447e-01,
-1.4578e-02, -2.8745e-01,  1.9089e-01,
-2.7251e-02,  9.8069e-02, -1.4580e-02,
-3.0276e-02,  1.4366e-02,  2.6363e-02,
-8.4962e-02,  7.8998e-02, -4.7717e-02,
-3.2004e-02, -2.1579e-02,  1.1247e-02,
 1.3895e-01, -3.3900e-01,  7.7998e-03,
 2.4769e-01, -1.8506e-01, -2.3116e-03,
 3.1361e-02, -1.1718e-02, -1.8286e-02,
-1.3020e-01,  1.4334e-01, -5.5700e-02,
-3.5386e-02,  1.0992e-01, -8.0235e-02,
-5.8978e-03,  7.7039e-02, -7.4619e-02,
-8.1603e-02,  1.2982e-01, -7.3193e-02,
-6.1469e-02,  1.7131e-01,  4.0255e-01,
-6.4582e-03, -8.2741e-02, -2.2220e-02,
 1.6876e-02, -3.2590e-02,  5.5645e-02,
 2.5231e-02,  2.9984e-01, -3.6995e-02,
 9.3322e-03,  2.0758e-01, -2.1986e-02,
-4.9568e-02,  2.1857e-03,  8.6127e-02,
 8.6593e-02, -5.8134e-01,  3.4507e-01,
 4.8855e-02, -1.0506e-01,  4.1584e-02,
 2.5428e-40, -4.4558e-40, -2.2090e-40,
-2.9727e-40, -4.8454e-40,  3.0397e-40,
 1.1696e-40, -3.3028e-40, -2.2959e-40
}
};)" + std::string(
R"(
__constant float biasL[8][8] = 
{
{
-3.1869e-08, -3.8279e-01, -6.3693e-05, -5.9054e-02,  9.3774e-04, -2.9944e-02, -1.1156e-03, -7.5635e-02
}
,
{
-1.7701e-01, -1.3417e-06, -3.0706e-40, -1.9022e-06, -1.2965e-02, -6.6444e-40,  1.4699e-02,  2.6082e-02
}
,
{
-3.7577e-07,  4.4550e-03, -8.1266e-04,  3.2408e-01, -1.1321e-07, -1.8907e-23, -1.9770e-25, -3.2394e-02
}
,
{
-2.1525e-14, -1.4130e-02, -1.9410e-02, -1.8703e-02, -2.9177e-02, -4.0635e-02,  7.8097e-02, -1.1643e-01
}
,
{
-2.6309e-02, -2.2238e-02,  6.8700e-03, -1.7973e-02, -1.0893e-02, -1.1888e-02, -4.9598e-03, -6.3663e-06
}
,
{
-1.2406e-03, -2.4901e-12, -9.7265e-07,  6.3490e-03,  1.3495e-01, -3.8411e-03, -6.6630e-03, -7.3614e-03
}
,
{
-2.7729e-03, -4.8174e-03, -6.3012e-03,  2.0491e-01, -2.0110e-03, -3.0974e-03,  5.1407e-01, -3.5016e-08
}
,
{
0.0324, 0.0140, 0.6750, 0.2661, 0.3646, 0.3591, 0.5597, 0.0816
}
};

__constant float kernelsL10[4 * 8] = 
{
 0.0882,  0.0422,
 0.3775,  0.4754,
-0.3209, -0.4870,
-0.0384,  0.0530,
 0.1034,  0.0173,
 0.5011,  0.3900,
 0.3621, -0.1645,
-0.1304,  0.0013,
 0.2230,  0.3026,
 0.1618, -0.4514,
-0.2097,  0.1894,
-0.0326,  0.1434,
 0.2421,  0.3363,
-0.0938,  0.3156,
 0.1137, -0.2165,
 0.2273, -0.1284
};


__kernel void conv1To8(
    __read_only image2d_t srcImg, 
    __write_only image2d_t tmpImgOut1, 
    __write_only image2d_t tmpImgOut2)
{
    const int x = get_global_id(0), y = get_global_id(1);
    if(x >= get_image_width(srcImg) || y >= get_image_height(srcImg))
        return;

    int2 coord = (int2)(x, y);

    float4 tl = read_imagef(srcImg, samplerN, (int2)(x-1,y-1));
    float4 tc = read_imagef(srcImg, samplerN, (int2)(x,y-1));
    float4 tr = read_imagef(srcImg, samplerN, (int2)(x+1,y-1));
    float4 ml = read_imagef(srcImg, samplerN, (int2)(x-1,y));
    float4 mc = read_imagef(srcImg, samplerN, coord);
    float4 mr = read_imagef(srcImg, samplerN, (int2)(x+1,y));
    float4 bl = read_imagef(srcImg, samplerN, (int2)(x-1,y+1));
    float4 bc = read_imagef(srcImg, samplerN, (int2)(x,y+1));
    float4 br = read_imagef(srcImg, samplerN, (int2)(x+1,y+1));

    float4 c1234 = RELU((float4)(
        tl.x * kernelsL1[0*9+0] + tc.x * kernelsL1[0*9+1] + tr.x * kernelsL1[0*9+2] +
        ml.x * kernelsL1[0*9+3] + mc.x * kernelsL1[0*9+4] + mr.x * kernelsL1[0*9+5] +
        bl.x * kernelsL1[0*9+6] + bc.x * kernelsL1[0*9+7] + br.x * kernelsL1[0*9+8] + biasL1[0],

        tl.x * kernelsL1[1*9+0] + tc.x * kernelsL1[1*9+1] + tr.x * kernelsL1[1*9+2] +
        ml.x * kernelsL1[1*9+3] + mc.x * kernelsL1[1*9+4] + mr.x * kernelsL1[1*9+5] +
        bl.x * kernelsL1[1*9+6] + bc.x * kernelsL1[1*9+7] + br.x * kernelsL1[1*9+8] + biasL1[1],

        tl.x * kernelsL1[2*9+0] + tc.x * kernelsL1[2*9+1] + tr.x * kernelsL1[2*9+2] +
        ml.x * kernelsL1[2*9+3] + mc.x * kernelsL1[2*9+4] + mr.x * kernelsL1[2*9+5] +
        bl.x * kernelsL1[2*9+6] + bc.x * kernelsL1[2*9+7] + br.x * kernelsL1[2*9+8] + biasL1[2],

        tl.x * kernelsL1[3*9+0] + tc.x * kernelsL1[3*9+1] + tr.x * kernelsL1[3*9+2] +
        ml.x * kernelsL1[3*9+3] + mc.x * kernelsL1[3*9+4] + mr.x * kernelsL1[3*9+5] +
        bl.x * kernelsL1[3*9+6] + bc.x * kernelsL1[3*9+7] + br.x * kernelsL1[3*9+8] + biasL1[3]
    ));
    float4 c5678 = RELU((float4)(
        tl.x * kernelsL1[4*9+0] + tc.x * kernelsL1[4*9+1] + tr.x * kernelsL1[4*9+2] +
        ml.x * kernelsL1[4*9+3] + mc.x * kernelsL1[4*9+4] + mr.x * kernelsL1[4*9+5] +
        bl.x * kernelsL1[4*9+6] + bc.x * kernelsL1[4*9+7] + br.x * kernelsL1[4*9+8] + biasL1[4],

        tl.x * kernelsL1[5*9+0] + tc.x * kernelsL1[5*9+1] + tr.x * kernelsL1[5*9+2] +
        ml.x * kernelsL1[5*9+3] + mc.x * kernelsL1[5*9+4] + mr.x * kernelsL1[5*9+5] +
        bl.x * kernelsL1[5*9+6] + bc.x * kernelsL1[5*9+7] + br.x * kernelsL1[5*9+8] + biasL1[5],

        tl.x * kernelsL1[6*9+0] + tc.x * kernelsL1[6*9+1] + tr.x * kernelsL1[6*9+2] +
        ml.x * kernelsL1[6*9+3] + mc.x * kernelsL1[6*9+4] + mr.x * kernelsL1[6*9+5] +
        bl.x * kernelsL1[6*9+6] + bc.x * kernelsL1[6*9+7] + br.x * kernelsL1[6*9+8] + biasL1[6],

        tl.x * kernelsL1[7*9+0] + tc.x * kernelsL1[7*9+1] + tr.x * kernelsL1[7*9+2] +
        ml.x * kernelsL1[7*9+3] + mc.x * kernelsL1[7*9+4] + mr.x * kernelsL1[7*9+5] +
        bl.x * kernelsL1[7*9+6] + bc.x * kernelsL1[7*9+7] + br.x * kernelsL1[7*9+8] + biasL1[7]
    ));

    write_imagef(tmpImgOut1, coord, c1234);
    write_imagef(tmpImgOut2, coord, c5678);
}
)"
R"(
__kernel void conv8To8(
    __read_only image2d_t tmpImgIn1,
    __read_only image2d_t tmpImgIn2, 
    __write_only image2d_t tmpImgOut1, 
    __write_only image2d_t tmpImgOut2,
    int l)
{
    const int x = get_global_id(0), y = get_global_id(1);
    if(x >= get_image_width(tmpImgIn1) || y >= get_image_height(tmpImgIn1))
        return;

    int2 coord = (int2)(x, y);

    float4 tl1 = read_imagef(tmpImgIn1, samplerN, (int2)(x-1,y-1));
    float4 tc1 = read_imagef(tmpImgIn1, samplerN, (int2)(x,y-1));
    float4 tr1 = read_imagef(tmpImgIn1, samplerN, (int2)(x+1,y-1));
    float4 ml1 = read_imagef(tmpImgIn1, samplerN, (int2)(x-1,y));
    float4 mc1 = read_imagef(tmpImgIn1, samplerN, coord);
    float4 mr1 = read_imagef(tmpImgIn1, samplerN, (int2)(x+1,y));
    float4 bl1 = read_imagef(tmpImgIn1, samplerN, (int2)(x-1,y+1));
    float4 bc1 = read_imagef(tmpImgIn1, samplerN, (int2)(x,y+1));
    float4 br1 = read_imagef(tmpImgIn1, samplerN, (int2)(x+1,y+1));

    float4 tl2 = read_imagef(tmpImgIn2, samplerN, (int2)(x-1,y-1));
    float4 tc2 = read_imagef(tmpImgIn2, samplerN, (int2)(x,y-1));
    float4 tr2 = read_imagef(tmpImgIn2, samplerN, (int2)(x+1,y-1));
    float4 ml2 = read_imagef(tmpImgIn2, samplerN, (int2)(x-1,y));
    float4 mc2 = read_imagef(tmpImgIn2, samplerN, coord);
    float4 mr2 = read_imagef(tmpImgIn2, samplerN, (int2)(x+1,y));
    float4 bl2 = read_imagef(tmpImgIn2, samplerN, (int2)(x-1,y+1));
    float4 bc2 = read_imagef(tmpImgIn2, samplerN, (int2)(x,y+1));
    float4 br2 = read_imagef(tmpImgIn2, samplerN, (int2)(x+1,y+1));
    
    float4 c1234 = RELU((float4)(
        tl1.x * kernelsL[l][0*72+0*9+0] + tc1.x * kernelsL[l][0*72+0*9+1] + tr1.x * kernelsL[l][0*72+0*9+2] +
        ml1.x * kernelsL[l][0*72+0*9+3] + mc1.x * kernelsL[l][0*72+0*9+4] + mr1.x * kernelsL[l][0*72+0*9+5] +
        bl1.x * kernelsL[l][0*72+0*9+6] + bc1.x * kernelsL[l][0*72+0*9+7] + br1.x * kernelsL[l][0*72+0*9+8] + 

        tl1.y * kernelsL[l][0*72+1*9+0] + tc1.y * kernelsL[l][0*72+1*9+1] + tr1.y * kernelsL[l][0*72+1*9+2] +
        ml1.y * kernelsL[l][0*72+1*9+3] + mc1.y * kernelsL[l][0*72+1*9+4] + mr1.y * kernelsL[l][0*72+1*9+5] +
        bl1.y * kernelsL[l][0*72+1*9+6] + bc1.y * kernelsL[l][0*72+1*9+7] + br1.y * kernelsL[l][0*72+1*9+8] + 

        tl1.z * kernelsL[l][0*72+2*9+0] + tc1.z * kernelsL[l][0*72+2*9+1] + tr1.z * kernelsL[l][0*72+2*9+2] +
        ml1.z * kernelsL[l][0*72+2*9+3] + mc1.z * kernelsL[l][0*72+2*9+4] + mr1.z * kernelsL[l][0*72+2*9+5] +
        bl1.z * kernelsL[l][0*72+2*9+6] + bc1.z * kernelsL[l][0*72+2*9+7] + br1.z * kernelsL[l][0*72+2*9+8] + 

        tl1.w * kernelsL[l][0*72+3*9+0] + tc1.w * kernelsL[l][0*72+3*9+1] + tr1.w * kernelsL[l][0*72+3*9+2] +
        ml1.w * kernelsL[l][0*72+3*9+3] + mc1.w * kernelsL[l][0*72+3*9+4] + mr1.w * kernelsL[l][0*72+3*9+5] +
        bl1.w * kernelsL[l][0*72+3*9+6] + bc1.w * kernelsL[l][0*72+3*9+7] + br1.w * kernelsL[l][0*72+3*9+8] +

        tl2.x * kernelsL[l][0*72+4*9+0] + tc2.x * kernelsL[l][0*72+4*9+1] + tr2.x * kernelsL[l][0*72+4*9+2] +
        ml2.x * kernelsL[l][0*72+4*9+3] + mc2.x * kernelsL[l][0*72+4*9+4] + mr2.x * kernelsL[l][0*72+4*9+5] +
        bl2.x * kernelsL[l][0*72+4*9+6] + bc2.x * kernelsL[l][0*72+4*9+7] + br2.x * kernelsL[l][0*72+4*9+8] + 

        tl2.y * kernelsL[l][0*72+5*9+0] + tc2.y * kernelsL[l][0*72+5*9+1] + tr2.y * kernelsL[l][0*72+5*9+2] +
        ml2.y * kernelsL[l][0*72+5*9+3] + mc2.y * kernelsL[l][0*72+5*9+4] + mr2.y * kernelsL[l][0*72+5*9+5] +
        bl2.y * kernelsL[l][0*72+5*9+6] + bc2.y * kernelsL[l][0*72+5*9+7] + br2.y * kernelsL[l][0*72+5*9+8] + 

        tl2.z * kernelsL[l][0*72+6*9+0] + tc2.z * kernelsL[l][0*72+6*9+1] + tr2.z * kernelsL[l][0*72+6*9+2] +
        ml2.z * kernelsL[l][0*72+6*9+3] + mc2.z * kernelsL[l][0*72+6*9+4] + mr2.z * kernelsL[l][0*72+6*9+5] +
        bl2.z * kernelsL[l][0*72+6*9+6] + bc2.z * kernelsL[l][0*72+6*9+7] + br2.z * kernelsL[l][0*72+6*9+8] + 

        tl2.w * kernelsL[l][0*72+7*9+0] + tc2.w * kernelsL[l][0*72+7*9+1] + tr2.w * kernelsL[l][0*72+7*9+2] +
        ml2.w * kernelsL[l][0*72+7*9+3] + mc2.w * kernelsL[l][0*72+7*9+4] + mr2.w * kernelsL[l][0*72+7*9+5] +
        bl2.w * kernelsL[l][0*72+7*9+6] + bc2.w * kernelsL[l][0*72+7*9+7] + br2.w * kernelsL[l][0*72+7*9+8] + biasL[l][0]
        ,
        tl1.x * kernelsL[l][1*72+0*9+0] + tc1.x * kernelsL[l][1*72+0*9+1] + tr1.x * kernelsL[l][1*72+0*9+2] +
        ml1.x * kernelsL[l][1*72+0*9+3] + mc1.x * kernelsL[l][1*72+0*9+4] + mr1.x * kernelsL[l][1*72+0*9+5] +
        bl1.x * kernelsL[l][1*72+0*9+6] + bc1.x * kernelsL[l][1*72+0*9+7] + br1.x * kernelsL[l][1*72+0*9+8] + 

        tl1.y * kernelsL[l][1*72+1*9+0] + tc1.y * kernelsL[l][1*72+1*9+1] + tr1.y * kernelsL[l][1*72+1*9+2] +
        ml1.y * kernelsL[l][1*72+1*9+3] + mc1.y * kernelsL[l][1*72+1*9+4] + mr1.y * kernelsL[l][1*72+1*9+5] +
        bl1.y * kernelsL[l][1*72+1*9+6] + bc1.y * kernelsL[l][1*72+1*9+7] + br1.y * kernelsL[l][1*72+1*9+8] + 

        tl1.z * kernelsL[l][1*72+2*9+0] + tc1.z * kernelsL[l][1*72+2*9+1] + tr1.z * kernelsL[l][1*72+2*9+2] +
        ml1.z * kernelsL[l][1*72+2*9+3] + mc1.z * kernelsL[l][1*72+2*9+4] + mr1.z * kernelsL[l][1*72+2*9+5] +
        bl1.z * kernelsL[l][1*72+2*9+6] + bc1.z * kernelsL[l][1*72+2*9+7] + br1.z * kernelsL[l][1*72+2*9+8] + 

        tl1.w * kernelsL[l][1*72+3*9+0] + tc1.w * kernelsL[l][1*72+3*9+1] + tr1.w * kernelsL[l][1*72+3*9+2] +
        ml1.w * kernelsL[l][1*72+3*9+3] + mc1.w * kernelsL[l][1*72+3*9+4] + mr1.w * kernelsL[l][1*72+3*9+5] +
        bl1.w * kernelsL[l][1*72+3*9+6] + bc1.w * kernelsL[l][1*72+3*9+7] + br1.w * kernelsL[l][1*72+3*9+8] +

        tl2.x * kernelsL[l][1*72+4*9+0] + tc2.x * kernelsL[l][1*72+4*9+1] + tr2.x * kernelsL[l][1*72+4*9+2] +
        ml2.x * kernelsL[l][1*72+4*9+3] + mc2.x * kernelsL[l][1*72+4*9+4] + mr2.x * kernelsL[l][1*72+4*9+5] +
        bl2.x * kernelsL[l][1*72+4*9+6] + bc2.x * kernelsL[l][1*72+4*9+7] + br2.x * kernelsL[l][1*72+4*9+8] + 

        tl2.y * kernelsL[l][1*72+5*9+0] + tc2.y * kernelsL[l][1*72+5*9+1] + tr2.y * kernelsL[l][1*72+5*9+2] +
        ml2.y * kernelsL[l][1*72+5*9+3] + mc2.y * kernelsL[l][1*72+5*9+4] + mr2.y * kernelsL[l][1*72+5*9+5] +
        bl2.y * kernelsL[l][1*72+5*9+6] + bc2.y * kernelsL[l][1*72+5*9+7] + br2.y * kernelsL[l][1*72+5*9+8] + 

        tl2.z * kernelsL[l][1*72+6*9+0] + tc2.z * kernelsL[l][1*72+6*9+1] + tr2.z * kernelsL[l][1*72+6*9+2] +
        ml2.z * kernelsL[l][1*72+6*9+3] + mc2.z * kernelsL[l][1*72+6*9+4] + mr2.z * kernelsL[l][1*72+6*9+5] +
        bl2.z * kernelsL[l][1*72+6*9+6] + bc2.z * kernelsL[l][1*72+6*9+7] + br2.z * kernelsL[l][1*72+6*9+8] + 

        tl2.w * kernelsL[l][1*72+7*9+0] + tc2.w * kernelsL[l][1*72+7*9+1] + tr2.w * kernelsL[l][1*72+7*9+2] +
        ml2.w * kernelsL[l][1*72+7*9+3] + mc2.w * kernelsL[l][1*72+7*9+4] + mr2.w * kernelsL[l][1*72+7*9+5] +
        bl2.w * kernelsL[l][1*72+7*9+6] + bc2.w * kernelsL[l][1*72+7*9+7] + br2.w * kernelsL[l][1*72+7*9+8] + biasL[l][1]
        ,
        tl1.x * kernelsL[l][2*72+0*9+0] + tc1.x * kernelsL[l][2*72+0*9+1] + tr1.x * kernelsL[l][2*72+0*9+2] +
        ml1.x * kernelsL[l][2*72+0*9+3] + mc1.x * kernelsL[l][2*72+0*9+4] + mr1.x * kernelsL[l][2*72+0*9+5] +
        bl1.x * kernelsL[l][2*72+0*9+6] + bc1.x * kernelsL[l][2*72+0*9+7] + br1.x * kernelsL[l][2*72+0*9+8] + 

        tl1.y * kernelsL[l][2*72+1*9+0] + tc1.y * kernelsL[l][2*72+1*9+1] + tr1.y * kernelsL[l][2*72+1*9+2] +
        ml1.y * kernelsL[l][2*72+1*9+3] + mc1.y * kernelsL[l][2*72+1*9+4] + mr1.y * kernelsL[l][2*72+1*9+5] +
        bl1.y * kernelsL[l][2*72+1*9+6] + bc1.y * kernelsL[l][2*72+1*9+7] + br1.y * kernelsL[l][2*72+1*9+8] + 

        tl1.z * kernelsL[l][2*72+2*9+0] + tc1.z * kernelsL[l][2*72+2*9+1] + tr1.z * kernelsL[l][2*72+2*9+2] +
        ml1.z * kernelsL[l][2*72+2*9+3] + mc1.z * kernelsL[l][2*72+2*9+4] + mr1.z * kernelsL[l][2*72+2*9+5] +
        bl1.z * kernelsL[l][2*72+2*9+6] + bc1.z * kernelsL[l][2*72+2*9+7] + br1.z * kernelsL[l][2*72+2*9+8] + 

        tl1.w * kernelsL[l][2*72+3*9+0] + tc1.w * kernelsL[l][2*72+3*9+1] + tr1.w * kernelsL[l][2*72+3*9+2] +
        ml1.w * kernelsL[l][2*72+3*9+3] + mc1.w * kernelsL[l][2*72+3*9+4] + mr1.w * kernelsL[l][2*72+3*9+5] +
        bl1.w * kernelsL[l][2*72+3*9+6] + bc1.w * kernelsL[l][2*72+3*9+7] + br1.w * kernelsL[l][2*72+3*9+8] +

        tl2.x * kernelsL[l][2*72+4*9+0] + tc2.x * kernelsL[l][2*72+4*9+1] + tr2.x * kernelsL[l][2*72+4*9+2] +
        ml2.x * kernelsL[l][2*72+4*9+3] + mc2.x * kernelsL[l][2*72+4*9+4] + mr2.x * kernelsL[l][2*72+4*9+5] +
        bl2.x * kernelsL[l][2*72+4*9+6] + bc2.x * kernelsL[l][2*72+4*9+7] + br2.x * kernelsL[l][2*72+4*9+8] + 

        tl2.y * kernelsL[l][2*72+5*9+0] + tc2.y * kernelsL[l][2*72+5*9+1] + tr2.y * kernelsL[l][2*72+5*9+2] +
        ml2.y * kernelsL[l][2*72+5*9+3] + mc2.y * kernelsL[l][2*72+5*9+4] + mr2.y * kernelsL[l][2*72+5*9+5] +
        bl2.y * kernelsL[l][2*72+5*9+6] + bc2.y * kernelsL[l][2*72+5*9+7] + br2.y * kernelsL[l][2*72+5*9+8] + 

        tl2.z * kernelsL[l][2*72+6*9+0] + tc2.z * kernelsL[l][2*72+6*9+1] + tr2.z * kernelsL[l][2*72+6*9+2] +
        ml2.z * kernelsL[l][2*72+6*9+3] + mc2.z * kernelsL[l][2*72+6*9+4] + mr2.z * kernelsL[l][2*72+6*9+5] +
        bl2.z * kernelsL[l][2*72+6*9+6] + bc2.z * kernelsL[l][2*72+6*9+7] + br2.z * kernelsL[l][2*72+6*9+8] + 

        tl2.w * kernelsL[l][2*72+7*9+0] + tc2.w * kernelsL[l][2*72+7*9+1] + tr2.w * kernelsL[l][2*72+7*9+2] +
        ml2.w * kernelsL[l][2*72+7*9+3] + mc2.w * kernelsL[l][2*72+7*9+4] + mr2.w * kernelsL[l][2*72+7*9+5] +
        bl2.w * kernelsL[l][2*72+7*9+6] + bc2.w * kernelsL[l][2*72+7*9+7] + br2.w * kernelsL[l][2*72+7*9+8] + biasL[l][2]
        ,
        tl1.x * kernelsL[l][3*72+0*9+0] + tc1.x * kernelsL[l][3*72+0*9+1] + tr1.x * kernelsL[l][3*72+0*9+2] +
        ml1.x * kernelsL[l][3*72+0*9+3] + mc1.x * kernelsL[l][3*72+0*9+4] + mr1.x * kernelsL[l][3*72+0*9+5] +
        bl1.x * kernelsL[l][3*72+0*9+6] + bc1.x * kernelsL[l][3*72+0*9+7] + br1.x * kernelsL[l][3*72+0*9+8] + 

        tl1.y * kernelsL[l][3*72+1*9+0] + tc1.y * kernelsL[l][3*72+1*9+1] + tr1.y * kernelsL[l][3*72+1*9+2] +
        ml1.y * kernelsL[l][3*72+1*9+3] + mc1.y * kernelsL[l][3*72+1*9+4] + mr1.y * kernelsL[l][3*72+1*9+5] +
        bl1.y * kernelsL[l][3*72+1*9+6] + bc1.y * kernelsL[l][3*72+1*9+7] + br1.y * kernelsL[l][3*72+1*9+8] + 

        tl1.z * kernelsL[l][3*72+2*9+0] + tc1.z * kernelsL[l][3*72+2*9+1] + tr1.z * kernelsL[l][3*72+2*9+2] +
        ml1.z * kernelsL[l][3*72+2*9+3] + mc1.z * kernelsL[l][3*72+2*9+4] + mr1.z * kernelsL[l][3*72+2*9+5] +
        bl1.z * kernelsL[l][3*72+2*9+6] + bc1.z * kernelsL[l][3*72+2*9+7] + br1.z * kernelsL[l][3*72+2*9+8] + 

        tl1.w * kernelsL[l][3*72+3*9+0] + tc1.w * kernelsL[l][3*72+3*9+1] + tr1.w * kernelsL[l][3*72+3*9+2] +
        ml1.w * kernelsL[l][3*72+3*9+3] + mc1.w * kernelsL[l][3*72+3*9+4] + mr1.w * kernelsL[l][3*72+3*9+5] +
        bl1.w * kernelsL[l][3*72+3*9+6] + bc1.w * kernelsL[l][3*72+3*9+7] + br1.w * kernelsL[l][3*72+3*9+8] +

        tl2.x * kernelsL[l][3*72+4*9+0] + tc2.x * kernelsL[l][3*72+4*9+1] + tr2.x * kernelsL[l][3*72+4*9+2] +
        ml2.x * kernelsL[l][3*72+4*9+3] + mc2.x * kernelsL[l][3*72+4*9+4] + mr2.x * kernelsL[l][3*72+4*9+5] +
        bl2.x * kernelsL[l][3*72+4*9+6] + bc2.x * kernelsL[l][3*72+4*9+7] + br2.x * kernelsL[l][3*72+4*9+8] + 

        tl2.y * kernelsL[l][3*72+5*9+0] + tc2.y * kernelsL[l][3*72+5*9+1] + tr2.y * kernelsL[l][3*72+5*9+2] +
        ml2.y * kernelsL[l][3*72+5*9+3] + mc2.y * kernelsL[l][3*72+5*9+4] + mr2.y * kernelsL[l][3*72+5*9+5] +
        bl2.y * kernelsL[l][3*72+5*9+6] + bc2.y * kernelsL[l][3*72+5*9+7] + br2.y * kernelsL[l][3*72+5*9+8] + 

        tl2.z * kernelsL[l][3*72+6*9+0] + tc2.z * kernelsL[l][3*72+6*9+1] + tr2.z * kernelsL[l][3*72+6*9+2] +
        ml2.z * kernelsL[l][3*72+6*9+3] + mc2.z * kernelsL[l][3*72+6*9+4] + mr2.z * kernelsL[l][3*72+6*9+5] +
        bl2.z * kernelsL[l][3*72+6*9+6] + bc2.z * kernelsL[l][3*72+6*9+7] + br2.z * kernelsL[l][3*72+6*9+8] + 

        tl2.w * kernelsL[l][3*72+7*9+0] + tc2.w * kernelsL[l][3*72+7*9+1] + tr2.w * kernelsL[l][3*72+7*9+2] +
        ml2.w * kernelsL[l][3*72+7*9+3] + mc2.w * kernelsL[l][3*72+7*9+4] + mr2.w * kernelsL[l][3*72+7*9+5] +
        bl2.w * kernelsL[l][3*72+7*9+6] + bc2.w * kernelsL[l][3*72+7*9+7] + br2.w * kernelsL[l][3*72+7*9+8] + biasL[l][3]
    ));)"
    R"(
    float4 c5678 = RELU((float4)(
        tl1.x * kernelsL[l][4*72+0*9+0] + tc1.x * kernelsL[l][4*72+0*9+1] + tr1.x * kernelsL[l][4*72+0*9+2] +
        ml1.x * kernelsL[l][4*72+0*9+3] + mc1.x * kernelsL[l][4*72+0*9+4] + mr1.x * kernelsL[l][4*72+0*9+5] +
        bl1.x * kernelsL[l][4*72+0*9+6] + bc1.x * kernelsL[l][4*72+0*9+7] + br1.x * kernelsL[l][4*72+0*9+8] + 

        tl1.y * kernelsL[l][4*72+1*9+0] + tc1.y * kernelsL[l][4*72+1*9+1] + tr1.y * kernelsL[l][4*72+1*9+2] +
        ml1.y * kernelsL[l][4*72+1*9+3] + mc1.y * kernelsL[l][4*72+1*9+4] + mr1.y * kernelsL[l][4*72+1*9+5] +
        bl1.y * kernelsL[l][4*72+1*9+6] + bc1.y * kernelsL[l][4*72+1*9+7] + br1.y * kernelsL[l][4*72+1*9+8] + 

        tl1.z * kernelsL[l][4*72+2*9+0] + tc1.z * kernelsL[l][4*72+2*9+1] + tr1.z * kernelsL[l][4*72+2*9+2] +
        ml1.z * kernelsL[l][4*72+2*9+3] + mc1.z * kernelsL[l][4*72+2*9+4] + mr1.z * kernelsL[l][4*72+2*9+5] +
        bl1.z * kernelsL[l][4*72+2*9+6] + bc1.z * kernelsL[l][4*72+2*9+7] + br1.z * kernelsL[l][4*72+2*9+8] + 

        tl1.w * kernelsL[l][4*72+3*9+0] + tc1.w * kernelsL[l][4*72+3*9+1] + tr1.w * kernelsL[l][4*72+3*9+2] +
        ml1.w * kernelsL[l][4*72+3*9+3] + mc1.w * kernelsL[l][4*72+3*9+4] + mr1.w * kernelsL[l][4*72+3*9+5] +
        bl1.w * kernelsL[l][4*72+3*9+6] + bc1.w * kernelsL[l][4*72+3*9+7] + br1.w * kernelsL[l][4*72+3*9+8] +

        tl2.x * kernelsL[l][4*72+4*9+0] + tc2.x * kernelsL[l][4*72+4*9+1] + tr2.x * kernelsL[l][4*72+4*9+2] +
        ml2.x * kernelsL[l][4*72+4*9+3] + mc2.x * kernelsL[l][4*72+4*9+4] + mr2.x * kernelsL[l][4*72+4*9+5] +
        bl2.x * kernelsL[l][4*72+4*9+6] + bc2.x * kernelsL[l][4*72+4*9+7] + br2.x * kernelsL[l][4*72+4*9+8] + 

        tl2.y * kernelsL[l][4*72+5*9+0] + tc2.y * kernelsL[l][4*72+5*9+1] + tr2.y * kernelsL[l][4*72+5*9+2] +
        ml2.y * kernelsL[l][4*72+5*9+3] + mc2.y * kernelsL[l][4*72+5*9+4] + mr2.y * kernelsL[l][4*72+5*9+5] +
        bl2.y * kernelsL[l][4*72+5*9+6] + bc2.y * kernelsL[l][4*72+5*9+7] + br2.y * kernelsL[l][4*72+5*9+8] + 

        tl2.z * kernelsL[l][4*72+6*9+0] + tc2.z * kernelsL[l][4*72+6*9+1] + tr2.z * kernelsL[l][4*72+6*9+2] +
        ml2.z * kernelsL[l][4*72+6*9+3] + mc2.z * kernelsL[l][4*72+6*9+4] + mr2.z * kernelsL[l][4*72+6*9+5] +
        bl2.z * kernelsL[l][4*72+6*9+6] + bc2.z * kernelsL[l][4*72+6*9+7] + br2.z * kernelsL[l][4*72+6*9+8] + 

        tl2.w * kernelsL[l][4*72+7*9+0] + tc2.w * kernelsL[l][4*72+7*9+1] + tr2.w * kernelsL[l][4*72+7*9+2] +
        ml2.w * kernelsL[l][4*72+7*9+3] + mc2.w * kernelsL[l][4*72+7*9+4] + mr2.w * kernelsL[l][4*72+7*9+5] +
        bl2.w * kernelsL[l][4*72+7*9+6] + bc2.w * kernelsL[l][4*72+7*9+7] + br2.w * kernelsL[l][4*72+7*9+8] + biasL[l][4]
        ,
        tl1.x * kernelsL[l][5*72+0*9+0] + tc1.x * kernelsL[l][5*72+0*9+1] + tr1.x * kernelsL[l][5*72+0*9+2] +
        ml1.x * kernelsL[l][5*72+0*9+3] + mc1.x * kernelsL[l][5*72+0*9+4] + mr1.x * kernelsL[l][5*72+0*9+5] +
        bl1.x * kernelsL[l][5*72+0*9+6] + bc1.x * kernelsL[l][5*72+0*9+7] + br1.x * kernelsL[l][5*72+0*9+8] + 

        tl1.y * kernelsL[l][5*72+1*9+0] + tc1.y * kernelsL[l][5*72+1*9+1] + tr1.y * kernelsL[l][5*72+1*9+2] +
        ml1.y * kernelsL[l][5*72+1*9+3] + mc1.y * kernelsL[l][5*72+1*9+4] + mr1.y * kernelsL[l][5*72+1*9+5] +
        bl1.y * kernelsL[l][5*72+1*9+6] + bc1.y * kernelsL[l][5*72+1*9+7] + br1.y * kernelsL[l][5*72+1*9+8] + 

        tl1.z * kernelsL[l][5*72+2*9+0] + tc1.z * kernelsL[l][5*72+2*9+1] + tr1.z * kernelsL[l][5*72+2*9+2] +
        ml1.z * kernelsL[l][5*72+2*9+3] + mc1.z * kernelsL[l][5*72+2*9+4] + mr1.z * kernelsL[l][5*72+2*9+5] +
        bl1.z * kernelsL[l][5*72+2*9+6] + bc1.z * kernelsL[l][5*72+2*9+7] + br1.z * kernelsL[l][5*72+2*9+8] + 

        tl1.w * kernelsL[l][5*72+3*9+0] + tc1.w * kernelsL[l][5*72+3*9+1] + tr1.w * kernelsL[l][5*72+3*9+2] +
        ml1.w * kernelsL[l][5*72+3*9+3] + mc1.w * kernelsL[l][5*72+3*9+4] + mr1.w * kernelsL[l][5*72+3*9+5] +
        bl1.w * kernelsL[l][5*72+3*9+6] + bc1.w * kernelsL[l][5*72+3*9+7] + br1.w * kernelsL[l][5*72+3*9+8] +

        tl2.x * kernelsL[l][5*72+4*9+0] + tc2.x * kernelsL[l][5*72+4*9+1] + tr2.x * kernelsL[l][5*72+4*9+2] +
        ml2.x * kernelsL[l][5*72+4*9+3] + mc2.x * kernelsL[l][5*72+4*9+4] + mr2.x * kernelsL[l][5*72+4*9+5] +
        bl2.x * kernelsL[l][5*72+4*9+6] + bc2.x * kernelsL[l][5*72+4*9+7] + br2.x * kernelsL[l][5*72+4*9+8] + 

        tl2.y * kernelsL[l][5*72+5*9+0] + tc2.y * kernelsL[l][5*72+5*9+1] + tr2.y * kernelsL[l][5*72+5*9+2] +
        ml2.y * kernelsL[l][5*72+5*9+3] + mc2.y * kernelsL[l][5*72+5*9+4] + mr2.y * kernelsL[l][5*72+5*9+5] +
        bl2.y * kernelsL[l][5*72+5*9+6] + bc2.y * kernelsL[l][5*72+5*9+7] + br2.y * kernelsL[l][5*72+5*9+8] + 

        tl2.z * kernelsL[l][5*72+6*9+0] + tc2.z * kernelsL[l][5*72+6*9+1] + tr2.z * kernelsL[l][5*72+6*9+2] +
        ml2.z * kernelsL[l][5*72+6*9+3] + mc2.z * kernelsL[l][5*72+6*9+4] + mr2.z * kernelsL[l][5*72+6*9+5] +
        bl2.z * kernelsL[l][5*72+6*9+6] + bc2.z * kernelsL[l][5*72+6*9+7] + br2.z * kernelsL[l][5*72+6*9+8] + 

        tl2.w * kernelsL[l][5*72+7*9+0] + tc2.w * kernelsL[l][5*72+7*9+1] + tr2.w * kernelsL[l][5*72+7*9+2] +
        ml2.w * kernelsL[l][5*72+7*9+3] + mc2.w * kernelsL[l][5*72+7*9+4] + mr2.w * kernelsL[l][5*72+7*9+5] +
        bl2.w * kernelsL[l][5*72+7*9+6] + bc2.w * kernelsL[l][5*72+7*9+7] + br2.w * kernelsL[l][5*72+7*9+8] + biasL[l][5]
        ,
        tl1.x * kernelsL[l][6*72+0*9+0] + tc1.x * kernelsL[l][6*72+0*9+1] + tr1.x * kernelsL[l][6*72+0*9+2] +
        ml1.x * kernelsL[l][6*72+0*9+3] + mc1.x * kernelsL[l][6*72+0*9+4] + mr1.x * kernelsL[l][6*72+0*9+5] +
        bl1.x * kernelsL[l][6*72+0*9+6] + bc1.x * kernelsL[l][6*72+0*9+7] + br1.x * kernelsL[l][6*72+0*9+8] + 

        tl1.y * kernelsL[l][6*72+1*9+0] + tc1.y * kernelsL[l][6*72+1*9+1] + tr1.y * kernelsL[l][6*72+1*9+2] +
        ml1.y * kernelsL[l][6*72+1*9+3] + mc1.y * kernelsL[l][6*72+1*9+4] + mr1.y * kernelsL[l][6*72+1*9+5] +
        bl1.y * kernelsL[l][6*72+1*9+6] + bc1.y * kernelsL[l][6*72+1*9+7] + br1.y * kernelsL[l][6*72+1*9+8] + 

        tl1.z * kernelsL[l][6*72+2*9+0] + tc1.z * kernelsL[l][6*72+2*9+1] + tr1.z * kernelsL[l][6*72+2*9+2] +
        ml1.z * kernelsL[l][6*72+2*9+3] + mc1.z * kernelsL[l][6*72+2*9+4] + mr1.z * kernelsL[l][6*72+2*9+5] +
        bl1.z * kernelsL[l][6*72+2*9+6] + bc1.z * kernelsL[l][6*72+2*9+7] + br1.z * kernelsL[l][6*72+2*9+8] + 

        tl1.w * kernelsL[l][6*72+3*9+0] + tc1.w * kernelsL[l][6*72+3*9+1] + tr1.w * kernelsL[l][6*72+3*9+2] +
        ml1.w * kernelsL[l][6*72+3*9+3] + mc1.w * kernelsL[l][6*72+3*9+4] + mr1.w * kernelsL[l][6*72+3*9+5] +
        bl1.w * kernelsL[l][6*72+3*9+6] + bc1.w * kernelsL[l][6*72+3*9+7] + br1.w * kernelsL[l][6*72+3*9+8] +

        tl2.x * kernelsL[l][6*72+4*9+0] + tc2.x * kernelsL[l][6*72+4*9+1] + tr2.x * kernelsL[l][6*72+4*9+2] +
        ml2.x * kernelsL[l][6*72+4*9+3] + mc2.x * kernelsL[l][6*72+4*9+4] + mr2.x * kernelsL[l][6*72+4*9+5] +
        bl2.x * kernelsL[l][6*72+4*9+6] + bc2.x * kernelsL[l][6*72+4*9+7] + br2.x * kernelsL[l][6*72+4*9+8] + 

        tl2.y * kernelsL[l][6*72+5*9+0] + tc2.y * kernelsL[l][6*72+5*9+1] + tr2.y * kernelsL[l][6*72+5*9+2] +
        ml2.y * kernelsL[l][6*72+5*9+3] + mc2.y * kernelsL[l][6*72+5*9+4] + mr2.y * kernelsL[l][6*72+5*9+5] +
        bl2.y * kernelsL[l][6*72+5*9+6] + bc2.y * kernelsL[l][6*72+5*9+7] + br2.y * kernelsL[l][6*72+5*9+8] + 

        tl2.z * kernelsL[l][6*72+6*9+0] + tc2.z * kernelsL[l][6*72+6*9+1] + tr2.z * kernelsL[l][6*72+6*9+2] +
        ml2.z * kernelsL[l][6*72+6*9+3] + mc2.z * kernelsL[l][6*72+6*9+4] + mr2.z * kernelsL[l][6*72+6*9+5] +
        bl2.z * kernelsL[l][6*72+6*9+6] + bc2.z * kernelsL[l][6*72+6*9+7] + br2.z * kernelsL[l][6*72+6*9+8] + 

        tl2.w * kernelsL[l][6*72+7*9+0] + tc2.w * kernelsL[l][6*72+7*9+1] + tr2.w * kernelsL[l][6*72+7*9+2] +
        ml2.w * kernelsL[l][6*72+7*9+3] + mc2.w * kernelsL[l][6*72+7*9+4] + mr2.w * kernelsL[l][6*72+7*9+5] +
        bl2.w * kernelsL[l][6*72+7*9+6] + bc2.w * kernelsL[l][6*72+7*9+7] + br2.w * kernelsL[l][6*72+7*9+8] + biasL[l][6]
        ,
        tl1.x * kernelsL[l][7*72+0*9+0] + tc1.x * kernelsL[l][7*72+0*9+1] + tr1.x * kernelsL[l][7*72+0*9+2] +
        ml1.x * kernelsL[l][7*72+0*9+3] + mc1.x * kernelsL[l][7*72+0*9+4] + mr1.x * kernelsL[l][7*72+0*9+5] +
        bl1.x * kernelsL[l][7*72+0*9+6] + bc1.x * kernelsL[l][7*72+0*9+7] + br1.x * kernelsL[l][7*72+0*9+8] + 

        tl1.y * kernelsL[l][7*72+1*9+0] + tc1.y * kernelsL[l][7*72+1*9+1] + tr1.y * kernelsL[l][7*72+1*9+2] +
        ml1.y * kernelsL[l][7*72+1*9+3] + mc1.y * kernelsL[l][7*72+1*9+4] + mr1.y * kernelsL[l][7*72+1*9+5] +
        bl1.y * kernelsL[l][7*72+1*9+6] + bc1.y * kernelsL[l][7*72+1*9+7] + br1.y * kernelsL[l][7*72+1*9+8] + 

        tl1.z * kernelsL[l][7*72+2*9+0] + tc1.z * kernelsL[l][7*72+2*9+1] + tr1.z * kernelsL[l][7*72+2*9+2] +
        ml1.z * kernelsL[l][7*72+2*9+3] + mc1.z * kernelsL[l][7*72+2*9+4] + mr1.z * kernelsL[l][7*72+2*9+5] +
        bl1.z * kernelsL[l][7*72+2*9+6] + bc1.z * kernelsL[l][7*72+2*9+7] + br1.z * kernelsL[l][7*72+2*9+8] + 

        tl1.w * kernelsL[l][7*72+3*9+0] + tc1.w * kernelsL[l][7*72+3*9+1] + tr1.w * kernelsL[l][7*72+3*9+2] +
        ml1.w * kernelsL[l][7*72+3*9+3] + mc1.w * kernelsL[l][7*72+3*9+4] + mr1.w * kernelsL[l][7*72+3*9+5] +
        bl1.w * kernelsL[l][7*72+3*9+6] + bc1.w * kernelsL[l][7*72+3*9+7] + br1.w * kernelsL[l][7*72+3*9+8] +

        tl2.x * kernelsL[l][7*72+4*9+0] + tc2.x * kernelsL[l][7*72+4*9+1] + tr2.x * kernelsL[l][7*72+4*9+2] +
        ml2.x * kernelsL[l][7*72+4*9+3] + mc2.x * kernelsL[l][7*72+4*9+4] + mr2.x * kernelsL[l][7*72+4*9+5] +
        bl2.x * kernelsL[l][7*72+4*9+6] + bc2.x * kernelsL[l][7*72+4*9+7] + br2.x * kernelsL[l][7*72+4*9+8] + 

        tl2.y * kernelsL[l][7*72+5*9+0] + tc2.y * kernelsL[l][7*72+5*9+1] + tr2.y * kernelsL[l][7*72+5*9+2] +
        ml2.y * kernelsL[l][7*72+5*9+3] + mc2.y * kernelsL[l][7*72+5*9+4] + mr2.y * kernelsL[l][7*72+5*9+5] +
        bl2.y * kernelsL[l][7*72+5*9+6] + bc2.y * kernelsL[l][7*72+5*9+7] + br2.y * kernelsL[l][7*72+5*9+8] + 

        tl2.z * kernelsL[l][7*72+6*9+0] + tc2.z * kernelsL[l][7*72+6*9+1] + tr2.z * kernelsL[l][7*72+6*9+2] +
        ml2.z * kernelsL[l][7*72+6*9+3] + mc2.z * kernelsL[l][7*72+6*9+4] + mr2.z * kernelsL[l][7*72+6*9+5] +
        bl2.z * kernelsL[l][7*72+6*9+6] + bc2.z * kernelsL[l][7*72+6*9+7] + br2.z * kernelsL[l][7*72+6*9+8] + 

        tl2.w * kernelsL[l][7*72+7*9+0] + tc2.w * kernelsL[l][7*72+7*9+1] + tr2.w * kernelsL[l][7*72+7*9+2] +
        ml2.w * kernelsL[l][7*72+7*9+3] + mc2.w * kernelsL[l][7*72+7*9+4] + mr2.w * kernelsL[l][7*72+7*9+5] +
        bl2.w * kernelsL[l][7*72+7*9+6] + bc2.w * kernelsL[l][7*72+7*9+7] + br2.w * kernelsL[l][7*72+7*9+8] + biasL[l][7]
    ));

    write_imagef(tmpImgOut1, coord, c1234);
    write_imagef(tmpImgOut2, coord, c5678);
}
)"
R"(
__kernel void convTranspose8To1(
    __read_only image2d_t tmpImgIn1,
    __read_only image2d_t tmpImgIn2, 
    __write_only image2d_t dstImg)
{
    const int x = get_global_id(0), y = get_global_id(1);
    if(x >= get_image_width(dstImg) || y >= get_image_height(dstImg))
        return;

    int2 coord = (int2)(x, y);

    float4 mc1 = read_imagef(tmpImgIn1, samplerN, (int2)(x / 2, y / 2));
    float4 mc2 = read_imagef(tmpImgIn2, samplerN, (int2)(x / 2, y / 2));

    int2 pos = (int2)(x & 1, y & 1);
    int flag = 0;

    if (pos.x == 0 && pos.y != 0)
        flag = 0;
        //0 x
        //0 0
    else if (pos.x == 0 && pos.y == 0)
        flag = 1;
        //0 0
        //0 x
    else if (pos.x != 0 && pos.y == 0)
        flag = 2;
        //0 0
        //x 0
    else if (pos.x != 0 && pos.y != 0)
        flag = 3;
        //x 0
        //0 0

        //180 degree rotation for kernel
        //0 1  to  3 2
        //2 3      1 0
    float4 c;
    float tmp;
    switch(flag)
    {
    case 0:
        tmp = clamp(
            mc1.x * kernelsL10[0*4+2] +
            mc1.y * kernelsL10[1*4+2] +
            mc1.z * kernelsL10[2*4+2] +
            mc1.w * kernelsL10[3*4+2] +
            mc2.x * kernelsL10[4*4+2] +
            mc2.y * kernelsL10[5*4+2] +
            mc2.z * kernelsL10[6*4+2] +
            mc2.w * kernelsL10[7*4+2], 0.0f, 1.0f);
        
        c = (float4)(tmp, tmp, tmp, 1.0f);
        break;
    case 1:
        tmp = clamp(
            mc1.x * kernelsL10[0*4+0] +
            mc1.y * kernelsL10[1*4+0] +
            mc1.z * kernelsL10[2*4+0] +
            mc1.w * kernelsL10[3*4+0] +
            mc2.x * kernelsL10[4*4+0] +
            mc2.y * kernelsL10[5*4+0] +
            mc2.z * kernelsL10[6*4+0] +
            mc2.w * kernelsL10[7*4+0], 0.0f, 1.0f);

        c = (float4)(tmp, tmp, tmp, 1.0f);
        break;
    case 2:
        tmp = clamp(
            mc1.x * kernelsL10[0*4+1] +
            mc1.y * kernelsL10[1*4+1] +
            mc1.z * kernelsL10[2*4+1] +
            mc1.w * kernelsL10[3*4+1] +
            mc2.x * kernelsL10[4*4+1] +
            mc2.y * kernelsL10[5*4+1] +
            mc2.z * kernelsL10[6*4+1] +
            mc2.w * kernelsL10[7*4+1], 0.0f, 1.0f);
            
        c = (float4)(tmp, tmp, tmp, 1.0f);
        break;
    case 3:
        tmp = clamp(
            mc1.x * kernelsL10[0*4+3] +
            mc1.y * kernelsL10[1*4+3] +
            mc1.z * kernelsL10[2*4+3] +
            mc1.w * kernelsL10[3*4+3] +
            mc2.x * kernelsL10[4*4+3] +
            mc2.y * kernelsL10[5*4+3] +
            mc2.z * kernelsL10[6*4+3] +
            mc2.w * kernelsL10[7*4+3], 0.0f, 1.0f);
            
        c = (float4)(tmp, tmp, tmp, 1.0f);
        break;
    }

    write_imagef(dstImg, coord, c);
}
)");
#endif // BUILT_IN_KERNEL
